Add Header and Footer to an existing empty word document with OpenXML SDK 2.0

前端 未结 3 1189
星月不相逢
星月不相逢 2020-12-16 14:35

I\'m trying to add a Header and Footer to an empty word document.

I use this code to add Header part in word/document.xml when change docx to zip.

           


        
相关标签:
3条回答
  • 2020-12-16 14:51

    this code worked for me. Take into consideration:

    1. header's relationship Id is "r97" in my example. Perhaps you would like to decide a unique rId on your own
    2. same for footer's relationshipId ("r98")
    3. Both header and footer have a hardcoded paragraph with some text.
    4. I am assuming a document already exists

                  using (WordprocessingDocument doc = WordprocessingDocument.Open(destination, true))
                  {
                      var mainDocPart = doc.MainDocumentPart;
                      if (doc == null) {
                          mainDocPart = doc.AddMainDocumentPart();
                      }
      
                      if (mainDocPart.Document == null)
                      {
                          mainDocPart.Document = new Document();
                      }
      
                      ApplyHeader(doc);
      
                      ApplyFooter(doc);
                  }
      

    ApplyHeader method:

    public static void ApplyHeader(WordprocessingDocument doc)
          {
              // Get the main document part.
              MainDocumentPart mainDocPart = doc.MainDocumentPart;
    
              HeaderPart headerPart1 = mainDocPart.AddNewPart<HeaderPart>("r97");
    
    
    
                Header header1 = new Header();
    
                Paragraph paragraph1 = new Paragraph(){  };
    
    
    
                Run run1 = new Run();
                Text text1 = new Text();
                text1.Text = "Header stuff";
    
                run1.Append(text1);
    
                paragraph1.Append(run1);
    
    
                header1.Append(paragraph1);
    
                headerPart1.Header = header1;
    
    
    
                SectionProperties sectionProperties1 = mainDocPart.Document.Body.Descendants<SectionProperties>().FirstOrDefault();
                if (sectionProperties1 == null)
                {
                    sectionProperties1 = new SectionProperties() { };
                    mainDocPart.Document.Body.Append(sectionProperties1);
                }
                HeaderReference headerReference1 = new HeaderReference() { Type = HeaderFooterValues.Default, Id = "r97" };
    
    
                sectionProperties1.InsertAt(headerReference1,0);
    
            }
    

    ApplyFooter method:

    public static void ApplyFooter(WordprocessingDocument doc)
          {
              // Get the main document part.
              MainDocumentPart mainDocPart = doc.MainDocumentPart;
    
              FooterPart footerPart1 = mainDocPart.AddNewPart<FooterPart>("r98");
    
    
    
              Footer footer1 = new Footer();
    
              Paragraph paragraph1 = new Paragraph() { };
    
    
    
              Run run1 = new Run();
              Text text1 = new Text();
              text1.Text = "Footer stuff";
    
              run1.Append(text1);
    
              paragraph1.Append(run1);
    
    
              footer1.Append(paragraph1);
    
              footerPart1.Footer = footer1;
    
    
    
              SectionProperties sectionProperties1 = mainDocPart.Document.Body.Descendants<SectionProperties>().FirstOrDefault();
              if (sectionProperties1 == null)
              {
                  sectionProperties1 = new SectionProperties() { };
                  mainDocPart.Document.Body.Append(sectionProperties1);
              }
              FooterReference footerReference1 = new FooterReference() { Type = DocumentFormat.OpenXml.Wordprocessing.HeaderFooterValues.Default,  Id = "r98" };
    
    
              sectionProperties1.InsertAt(footerReference1, 0);
    
          }
    

    Enjoy,

    0 讨论(0)
  • 2020-12-16 14:54

    I find the solution by myself.

    In fact, adding a header or a footer in a docx with OpenXml involves that :

    Document has to exist.

    Saving and closing document before adding a header or a footer does not work.

    WordprocessingDocument document = WordprocessingDocument.Open(path, true);
    <operations on docx>
    document.Save();
    document.Close();
    ChangeHeader(document);
    

    You have to re-open a second time your docx to create a new instanciation of the document.

    Correct solution will be (with James Wood solution):

    WordprocessingDocument document = WordprocessingDocument.Open(path, true);
    <operations on docx>
    document.Save();
    document.Close();
    ChangeHeader(path);
    
        public static void ChangeHeader(String documentPath)
        {
            // Replace header in target document with header of source document.
            using (WordprocessingDocument document = WordprocessingDocument.Open(documentPath, true))
            {
                // Get the main document part
                MainDocumentPart mainDocumentPart = document.MainDocumentPart;
    
                // Delete the existing header and footer parts
                mainDocumentPart.DeleteParts(mainDocumentPart.HeaderParts);
                mainDocumentPart.DeleteParts(mainDocumentPart.FooterParts);
    
                // Create a new header and footer part
                HeaderPart headerPart = mainDocumentPart.AddNewPart<HeaderPart>();
                FooterPart footerPart = mainDocumentPart.AddNewPart<FooterPart>();
    
                // Get Id of the headerPart and footer parts
                string headerPartId = mainDocumentPart.GetIdOfPart(headerPart);
                string footerPartId = mainDocumentPart.GetIdOfPart(footerPart);
    
                GenerateHeaderPartContent(headerPart);
    
                GenerateFooterPartContent(footerPart);
    
                // Get SectionProperties and Replace HeaderReference and FooterRefernce with new Id
                IEnumerable<SectionProperties> sections = mainDocumentPart.Document.Body.Elements<SectionProperties>();
    
                foreach (var section in sections)
                {
                    // Delete existing references to headers and footers
                    section.RemoveAllChildren<HeaderReference>();
                    section.RemoveAllChildren<FooterReference>();
    
                    // Create the new header and footer reference node
                    section.PrependChild<HeaderReference>(new HeaderReference() { Id = headerPartId });
                    section.PrependChild<FooterReference>(new FooterReference() { Id = footerPartId });
                }
            }
        }
    
    
    public static void GenerateHeaderPartContent(HeaderPart part)
            {
                Header header1 = new Header() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "w14 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("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 = "00164C17", RsidRunAdditionDefault = "00164C17" };
    
                ParagraphProperties paragraphProperties1 = new ParagraphProperties();
                ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId() { Val = "Header" };
    
                paragraphProperties1.Append(paragraphStyleId1);
    
                Run run1 = new Run();
                Text text1 = new Text();
                text1.Text = "Header";
    
                run1.Append(text1);
    
                paragraph1.Append(paragraphProperties1);
                paragraph1.Append(run1);
    
                header1.Append(paragraph1);
    
                part.Header = header1;
            }
    
            public static void GenerateFooterPartContent(FooterPart part)
            {
                Footer footer1 = new Footer() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "w14 wp14" } };
                footer1.AddNamespaceDeclaration("wpc", "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas");
                footer1.AddNamespaceDeclaration("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
                footer1.AddNamespaceDeclaration("o", "urn:schemas-microsoft-com:office:office");
                footer1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
                footer1.AddNamespaceDeclaration("m", "http://schemas.openxmlformats.org/officeDocument/2006/math");
                footer1.AddNamespaceDeclaration("v", "urn:schemas-microsoft-com:vml");
                footer1.AddNamespaceDeclaration("wp14", "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing");
                footer1.AddNamespaceDeclaration("wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing");
                footer1.AddNamespaceDeclaration("w10", "urn:schemas-microsoft-com:office:word");
                footer1.AddNamespaceDeclaration("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
                footer1.AddNamespaceDeclaration("w14", "http://schemas.microsoft.com/office/word/2010/wordml");
                footer1.AddNamespaceDeclaration("wpg", "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup");
                footer1.AddNamespaceDeclaration("wpi", "http://schemas.microsoft.com/office/word/2010/wordprocessingInk");
                footer1.AddNamespaceDeclaration("wne", "http://schemas.microsoft.com/office/word/2006/wordml");
                footer1.AddNamespaceDeclaration("wps", "http://schemas.microsoft.com/office/word/2010/wordprocessingShape");
    
                Paragraph paragraph1 = new Paragraph() { RsidParagraphAddition = "00164C17", RsidRunAdditionDefault = "00164C17" };
    
                ParagraphProperties paragraphProperties1 = new ParagraphProperties();
                ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId() { Val = "Footer" };
    
                paragraphProperties1.Append(paragraphStyleId1);
    
                Run run1 = new Run();
                Text text1 = new Text();
                text1.Text = "Footer";
    
                run1.Append(text1);
    
                paragraph1.Append(paragraphProperties1);
                paragraph1.Append(run1);
    
                footer1.Append(paragraph1);
    
                part.Footer = footer1;
            }
    
    0 讨论(0)
  • 2020-12-16 15:11

    I'm quite sure what is wrong with your code, I suspect its the way you are changing the references.

    In any case I have a working example which you should hopefully guide you.

    I've based mine from examples here: http://msdn.microsoft.com/en-us/library/office/cc546917.aspx

    I used the Open XML SDK 2.0 Productivity Tool to Generate the Header and Footer parts. I first create a document with my desired layout then open it with the tool, it generates the XML or Code. You can get it here: http://www.microsoft.com/en-us/download/details.aspx?id=5124

    The only caveat to this is that it assumes the document already some content in the body, a single letter will do. I'm not sure if this can be avoided, I tried opening an empty document in the Productivity Tool and it suffers from the same error - "Cannot open the file: Archive file cannot be size 0". In my sample it will fail on WordprocessingDocument.Open.

    Maybe in the case of an empty document you have to create a body first. In any case I suspect the main aim of this question is to add a header and footer so I feel this is a valid answer.

    If you want I can provide the actual cs/project files.

    Hope this helps.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Wordprocessing;
    using DocumentFormat.OpenXml;
    
    namespace HeaderFooterDocX
    {
        class Program
        {
            static void Main(string[] args)
            {
                ChangeHeader(@"C:\Users\James\Desktop\Document.docx");
            }
    
            static void ChangeHeader(String documentPath)
            {
                // Replace header in target document with header of source document.
                using (WordprocessingDocument document = WordprocessingDocument.Open(documentPath, true))
                {
                    // Get the main document part
                    MainDocumentPart mainDocumentPart = document.MainDocumentPart;
    
                    // Delete the existing header and footer parts
                    mainDocumentPart.DeleteParts(mainDocumentPart.HeaderParts);
                    mainDocumentPart.DeleteParts(mainDocumentPart.FooterParts);
    
                    // Create a new header and footer part
                    HeaderPart headerPart = mainDocumentPart.AddNewPart<HeaderPart>();
                    FooterPart footerPart = mainDocumentPart.AddNewPart<FooterPart>();
    
                    // Get Id of the headerPart and footer parts
                    string headerPartId = mainDocumentPart.GetIdOfPart(headerPart);
                    string footerPartId = mainDocumentPart.GetIdOfPart(footerPart);
    
                    GenerateHeaderPartContent(headerPart);
    
                    GenerateFooterPartContent(footerPart);
    
                    // Get SectionProperties and Replace HeaderReference and FooterRefernce with new Id
                    IEnumerable<SectionProperties> sections = mainDocumentPart.Document.Body.Elements<SectionProperties>();
    
                    foreach (var section in sections)
                    {
                        // Delete existing references to headers and footers
                        section.RemoveAllChildren<HeaderReference>();
                        section.RemoveAllChildren<FooterReference>();
    
                        // Create the new header and footer reference node
                        section.PrependChild<HeaderReference>(new HeaderReference() { Id = headerPartId });
                        section.PrependChild<FooterReference>(new FooterReference() { Id = footerPartId });
                    }
                }
            }
    
            static void GenerateHeaderPartContent(HeaderPart part)
            {
                Header header1 = new Header() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "w14 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("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 = "00164C17", RsidRunAdditionDefault = "00164C17" };
    
                ParagraphProperties paragraphProperties1 = new ParagraphProperties();
                ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId() { Val = "Header" };
    
                paragraphProperties1.Append(paragraphStyleId1);
    
                Run run1 = new Run();
                Text text1 = new Text();
                text1.Text = "Header";
    
                run1.Append(text1);
    
                paragraph1.Append(paragraphProperties1);
                paragraph1.Append(run1);
    
                header1.Append(paragraph1);
    
                part.Header = header1;
            }
    
            static void GenerateFooterPartContent(FooterPart part)
            {
                Footer footer1 = new Footer() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "w14 wp14" } };
                footer1.AddNamespaceDeclaration("wpc", "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas");
                footer1.AddNamespaceDeclaration("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
                footer1.AddNamespaceDeclaration("o", "urn:schemas-microsoft-com:office:office");
                footer1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
                footer1.AddNamespaceDeclaration("m", "http://schemas.openxmlformats.org/officeDocument/2006/math");
                footer1.AddNamespaceDeclaration("v", "urn:schemas-microsoft-com:vml");
                footer1.AddNamespaceDeclaration("wp14", "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing");
                footer1.AddNamespaceDeclaration("wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing");
                footer1.AddNamespaceDeclaration("w10", "urn:schemas-microsoft-com:office:word");
                footer1.AddNamespaceDeclaration("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
                footer1.AddNamespaceDeclaration("w14", "http://schemas.microsoft.com/office/word/2010/wordml");
                footer1.AddNamespaceDeclaration("wpg", "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup");
                footer1.AddNamespaceDeclaration("wpi", "http://schemas.microsoft.com/office/word/2010/wordprocessingInk");
                footer1.AddNamespaceDeclaration("wne", "http://schemas.microsoft.com/office/word/2006/wordml");
                footer1.AddNamespaceDeclaration("wps", "http://schemas.microsoft.com/office/word/2010/wordprocessingShape");
    
                Paragraph paragraph1 = new Paragraph() { RsidParagraphAddition = "00164C17", RsidRunAdditionDefault = "00164C17" };
    
                ParagraphProperties paragraphProperties1 = new ParagraphProperties();
                ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId() { Val = "Footer" };
    
                paragraphProperties1.Append(paragraphStyleId1);
    
                Run run1 = new Run();
                Text text1 = new Text();
                text1.Text = "Footer";
    
                run1.Append(text1);
    
                paragraph1.Append(paragraphProperties1);
                paragraph1.Append(run1);
    
                footer1.Append(paragraph1);
    
                part.Footer = footer1;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题