Search code examples
c#hyperlinkms-wordopenxml

How to add hyperlink that links to heading in word with openxml


I'm trying to add a hyperlink that links to a heading inside the same word document.

This is my code so far:

  1. First I add the hyperlink

    Paragraph p = new Paragraph();
    Hyperlink h = new Hyperlink(){ Anchor = new StringValue("_Link") };
    Run r = new Run();
    RunProperties rp = new RunProperties(){ Val = "Hyperlink" };
    Text t = new Text("Click here");
    
    r.Append(rp);
    r.Append(t);
    p.Append(r);
    body.Append(p);
    
  2. Then I add the Heading (with the necessary Bookmark)

    Paragraph p = new Paragraph();
    Run r = new Run(new Text("My Heading"));
    ParagraphProperties pp = new ParagraphProperties();
    ParagraphStyleId psi = new ParagraphStyleId(){ Val = new StringValue("Heading1") };
    
    p.Append(r);
    p.Append(pp);
    p.Append(psi);
    p.Append(new BookmarkStart() { Name = new StringValue("_Link") };
    p.Append(new BookmarkEnd());
    body.Append(p);
    

I don't see what I'm missing. I set the anchor in the hyperlink, that should link to the Heading with a Bookmark which holds the equal name. (Anchor from hyperlink == Name from Bookmark in Heading).

Or do I need to add a HyperLinkRelationship to MainDocumentPart.HyperlinkRelationship, like I've to do when I want to add a hyperlink with an URI to a website?


Solution

  • You are adding header as a paragraph to the body instead, you need to create the header part -

    HeaderPart headerPart = mainDocumentPart.AddNewPart<HeaderPart>();
    
    string headerPartId = mainDocumentPart.GetIdOfPart(headerPart);
    
    GenerateHeaderPartContent(headerPart);
    

    And the code for GenerateHeaderPartContent

     private void GeneratePartContent(HeaderPart part)
            {
                Header header1 = new Header(){ MCAttributes = new MarkupCompatibilityAttributes(){ Ignorable = "w14 w15 wp14" }  };
                header1.AddNamespaceDeclaration("wpc", "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas");
                header1.AddNamespaceDeclaration("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
                header1.AddNamespaceDeclaration("o", "urn:schemas-microsoft-com:office:office");
                header1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
                header1.AddNamespaceDeclaration("m", "http://schemas.openxmlformats.org/officeDocument/2006/math");
                header1.AddNamespaceDeclaration("v", "urn:schemas-microsoft-com:vml");
                header1.AddNamespaceDeclaration("wp14", "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing");
                header1.AddNamespaceDeclaration("wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing");
                header1.AddNamespaceDeclaration("w10", "urn:schemas-microsoft-com:office:word");
                header1.AddNamespaceDeclaration("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
                header1.AddNamespaceDeclaration("w14", "http://schemas.microsoft.com/office/word/2010/wordml");
                header1.AddNamespaceDeclaration("w15", "http://schemas.microsoft.com/office/word/2012/wordml");
                header1.AddNamespaceDeclaration("wpg", "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup");
                header1.AddNamespaceDeclaration("wpi", "http://schemas.microsoft.com/office/word/2010/wordprocessingInk");
                header1.AddNamespaceDeclaration("wne", "http://schemas.microsoft.com/office/word/2006/wordml");
                header1.AddNamespaceDeclaration("wps", "http://schemas.microsoft.com/office/word/2010/wordprocessingShape");
    
                Paragraph paragraph1 = new Paragraph(){ RsidParagraphAddition = "00225DC9", RsidRunAdditionDefault = "00225DC9" };
    
                ParagraphProperties paragraphProperties1 = new ParagraphProperties();
                ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId(){ Val = "Header" };
    
                paragraphProperties1.Append(paragraphStyleId1);
                BookmarkStart bookmarkStart1 = new BookmarkStart(){ Name = "HeadingBookmark", Id = "1" };
    
                Run run1 = new Run();
                Text text1 = new Text();
                text1.Text = "Test";
    
                run1.Append(text1);
    
                paragraph1.Append(paragraphProperties1);
                paragraph1.Append(bookmarkStart1);
                paragraph1.Append(run1);
                BookmarkEnd bookmarkEnd1 = new BookmarkEnd(){ Id = "1" };
    
    
                header1.Append(paragraph1);
                header1.Append(bookmarkEnd1);
    
    
                part.Header = header1;
            }
    

    Once the header part is ready, add it to your documents section properties -

    HeaderReference headerReference1 = new HeaderReference(){ Type = HeaderFooterValues.Default, Id = headerPartId  };
    

    Also a good ref to check - https://msdn.microsoft.com/en-us/library/office/cc546917.aspx