2017-10-04 169 views
0

我们拥有一个带有页眉和页脚的主docx,并且没有其他任何内容(用图像格式化)。我们有100个包含正文内容但没有页眉和页脚的文档文档,我们希望能够在填充它们并在主页眉和页脚docx中添加页眉和页脚时处理这些文档。将页眉和页脚复制到所有其他文档OpenXML

我已经看过这里的MSDN文档:https://msdn.microsoft.com/en-us/library/cc546917.aspx但它似乎不工作,当我打开目标文档格式是错误的,图像丢失。

有没有办法使这个完全复制从一个文件到另一个文件的页眉和页脚?

回答

0

我也不得不在实际工作中为客户实现这一点。 我会给你我为页眉和页脚编写的方法。

我写了试图保留页眉和页脚内的所有样式,字体,尺寸和图像。

这是我用来将头附加到另一个docx的方法。

试着理解阅读我写的评论。

headerTemplatePath:DOCX的路径,其中取头

documentPath:DOCX的路径,其中附加标头

public void PrependHeader(string headerTemplatePath, string documentPath) 
    { 
     // Open docx where we need to add header 
     using (var wdDoc = WordprocessingDocument.Open(documentPath, true)) 
     { 
      var mainPart = wdDoc.MainDocumentPart; 

      // Delete exist header 
      mainPart.DeleteParts(mainPart.HeaderParts); 

      // Create new header 
      var headerPart = mainPart.AddNewPart<HeaderPart>(); 

      // Get id of new header 
      var rId = mainPart.GetIdOfPart(headerPart); 

      // Open the header document to be copied 
      using (var wdDocSource = WordprocessingDocument.Open(headerTemplatePath, true)) 
      { 
       // Get header part 
       var firstHeader = wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault(); 
       if (firstHeader != null) 
       { 
        // Copy content of header to new header 
        headerPart.FeedData(firstHeader.GetStream()); 
        // Keep formatting 
        foreach (var childElement in headerPart.Header.Descendants<Paragraph>()) 
        { 
         var paragraph = (Paragraph) childElement; 
         if (paragraph.ParagraphProperties.SpacingBetweenLines == null) 
         { 
          paragraph.ParagraphProperties.SpacingBetweenLines = new SpacingBetweenLines 
          { 
           After = "0" 
          }; 
          paragraph.ParagraphProperties.ParagraphStyleId = new ParagraphStyleId 
          { 
           Val = "No Spacing" 
          }; 
         } 
        } 
        // Get all ids of every 'Parts' 
        var listToAdd = new List<KeyValuePair<Type, Stream>>(); 
        foreach (var idPart in firstHeader.Parts) 
        { 
         var part = firstHeader.GetPartById(idPart.RelationshipId); 
         if (part is ImagePart) 
         { 
          headerPart.AddNewPart<ImagePart>("image/png", idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (ImagePart), part.GetStream())); 
         } 
         else if (part is DiagramStylePart) 
         { 
          headerPart.AddNewPart<DiagramStylePart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramStylePart), part.GetStream())); 
         } 
         else if (part is DiagramColorsPart) 
         { 
          headerPart.AddNewPart<DiagramColorsPart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramColorsPart), 
           part.GetStream())); 
         } 
         else if (part is DiagramDataPart) 
         { 
          headerPart.AddNewPart<DiagramDataPart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramDataPart), part.GetStream())); 
         } 
         else if (part is DiagramLayoutDefinitionPart) 
         { 
          headerPart.AddNewPart<DiagramStylePart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramStylePart), part.GetStream())); 
         } 
         else if (part is DiagramPersistLayoutPart) 
         { 
          headerPart.AddNewPart<DiagramPersistLayoutPart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramPersistLayoutPart), 
           part.GetStream())); 
         } 
        } 
        // Foreach Part, copy stream to new header 
        var i = 0; 
        foreach (var idPart in headerPart.Parts) 
        { 
         var part = headerPart.GetPartById(idPart.RelationshipId); 
         if (part.GetType() == listToAdd[i].Key) 
         { 
          part.FeedData(listToAdd[i].Value); 
         } 
         i++; 
        } 
       } 
       else 
       { 
        mainPart.DeleteParts(mainPart.HeaderParts); 
        var sectToRemovePrs = mainPart.Document.Body.Descendants<SectionProperties>(); 
        foreach (var sectPr in sectToRemovePrs) 
        { 
         // Delete reference of old header 
         sectPr.RemoveAllChildren<HeaderReference>(); 
        } 
        return; 
       } 
      } 

      // Get all sections, and past header to each section (Page) 
      var sectPrs = mainPart.Document.Body.Descendants<SectionProperties>(); 
      foreach (var sectPr in sectPrs) 
      { 
       // Remove old header reference 
       sectPr.RemoveAllChildren<HeaderReference>(); 
       // Add new header reference 
       sectPr.PrependChild(new HeaderReference { Id = rId }); 
      } 
     } 
    } 

页脚方法:

footerTemplatePath:DOCX的路径,其中采取页脚

documentPath:docx的路径,其中追加页脚

public void PrependFooter(string footerTemplatePath, string documentPath) 
    { 
     // Open docx where append footer 
     using (var wdDoc = WordprocessingDocument.Open(documentPath, true)) 
     { 
      var mainPart = wdDoc.MainDocumentPart; 

      // Remove exist footer 
      mainPart.DeleteParts(mainPart.FooterParts); 

      // Create new footer 
      var footerParts = mainPart.AddNewPart<FooterPart>(); 

      // Get Id of new footer 
      var rId = mainPart.GetIdOfPart(footerParts); 

      // Open the footer document to be copied 
      using (var wdDocSource = WordprocessingDocument.Open(footerTemplatePath, true)) 
      { 
       var firstFooter = wdDocSource.MainDocumentPart.FooterParts.LastOrDefault(); 
       if (firstFooter != null) 
       { 
        // Copy content of footer 
        footerParts.FeedData(firstFooter.GetStream()); 
        // Keep formatting 
        foreach (var childElement in footerParts.Footer.Descendants<Paragraph>()) 
        { 
         var paragraph = (Paragraph) childElement; 
         if (paragraph.ParagraphProperties.SpacingBetweenLines == null) 
         { 
          paragraph.ParagraphProperties.SpacingBetweenLines = new SpacingBetweenLines 
          { 
           After = "0" 
          }; 
          paragraph.ParagraphProperties.ParagraphStyleId = new ParagraphStyleId 
          { 
           Val = "No Spacing" 
          }; 
         } 
        } 
        // Create list of Parts ID needed to new footer 
        var listToAdd = new List<KeyValuePair<Type, Stream>>(); 
        foreach (var idPart in firstFooter.Parts) 
        { 
         var part = firstFooter.GetPartById(idPart.RelationshipId); 
         if (part is ImagePart) 
         { 
          footerParts.AddNewPart<ImagePart>("image/png", idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (ImagePart), part.GetStream())); 
         } 
         else if (part is DiagramStylePart) 
         { 
          footerParts.AddNewPart<DiagramStylePart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramStylePart), part.GetStream())); 
         } 
         else if (part is DiagramColorsPart) 
         { 
          footerParts.AddNewPart<DiagramColorsPart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramColorsPart), 
           part.GetStream())); 
         } 
         else if (part is DiagramDataPart) 
         { 
          footerParts.AddNewPart<DiagramDataPart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramDataPart), part.GetStream())); 
         } 
         else if (part is DiagramLayoutDefinitionPart) 
         { 
          footerParts.AddNewPart<DiagramStylePart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramStylePart), part.GetStream())); 
         } 
         else if (part is DiagramPersistLayoutPart) 
         { 
          footerParts.AddNewPart<DiagramPersistLayoutPart>(idPart.RelationshipId); 
          listToAdd.Add(new KeyValuePair<Type, Stream>(typeof (DiagramPersistLayoutPart), 
           part.GetStream())); 
         } 
        } 
        // Foreach ID, copy stream to new footer 
        var i = 0; 
        foreach (var idPart in footerParts.Parts) 
        { 
         var part = footerParts.GetPartById(idPart.RelationshipId); 
         if (part.GetType() == listToAdd[i].Key) 
         { 
          part.FeedData(listToAdd[i].Value); 
         } 
         i++; 
        } 
       } 
       else 
       { 
        mainPart.DeleteParts(mainPart.FooterParts); 
        var sectToRemovePrs = mainPart.Document.Body.Descendants<SectionProperties>(); 
        foreach (var sectPr in sectToRemovePrs) 
        { 
         // Delete reference of footer 
         sectPr.RemoveAllChildren<FooterReference>(); 
        } 
        return; 
       } 
      } 

      // Get all sections, and past footer to each section (Page) 
      var sectPrs = mainPart.Document.Body.Descendants<SectionProperties>(); 
      foreach (var sectPr in sectPrs) 
      { 
       // Delete old reference 
       sectPr.RemoveAllChildren<FooterReference>(); 
       // Add new footer reference 
       sectPr.PrependChild(new FooterReference { Id = rId }); 
      } 
     } 
    } 

对不起,我的英语,如果您有任何问题,请告诉我。

再见。