2011-01-11 68 views
0

我想下面的代码。它需要一个文件名(包含很多部分的docx文件),我尝试遍历每个部分获取部分名称。问题是我最终得到了不可读的docx文件。它不会出错,但我认为我在获取该部分中的元素时遇到了问题。OpenXml Sdk - 复制docx的部分到另一个docx

public void Split(string fileName) { 
      using (WordprocessingDocument myDoc = 
       WordprocessingDocument.Open(fileName, true)) { 
       string curCliCode = ""; 
       MainDocumentPart mdp = myDoc.MainDocumentPart; 

       foreach (var element in mdp.Document.Body.ChildElements) { 
        if (element.Descendants().OfType<SectionProperties>().Count() == 1) { 
         //get the name of the section from the footer 
         var footer = (FooterPart) mdp.GetPartById(
                 element.Descendants().OfType<SectionProperties>().First().OfType 
                  <FooterReference>().First(). 
                  Id.Value); 
         foreach (Paragraph p in footer.Footer.ChildElements.OfType<Paragraph>()) { 
          if (p.InnerText != "") { 
           curCliCode = p.InnerText; 
          } 
         } 
         if (curCliCode != "") { 
          var forFile = new List<OpenXmlElement>(); 
          var els = element.ElementsBefore(); 
          if (els != null) { 
           foreach (var e in els) { 
            if (e != null) { 
             forFile.Add(e); 
            } 
           } 
           for (int i = 0; i < els.Count(); i++) { 
            els.ElementAt(i).Remove(); 
           } 
          } 
          Create(curCliCode, forFile); 
         } 
        } 
       } 

      } 
     } 
     private void Create(string cliCode,IEnumerable<OpenXmlElement> docParts) { 
      var parts = from e in docParts select e.Clone(); 
      const string template = @"\Test\toSplit\blank.docx"; 
      string destination = string.Format(@"\Test\{0}.docx", cliCode); 
      File.Copy(template, destination,true); 
      /* Create the package and main document part */ 
      using (WordprocessingDocument myDoc = 
       WordprocessingDocument.Open(destination, true)) { 
       MainDocumentPart mainPart = myDoc.MainDocumentPart; 
       /* Create the contents */ 
       foreach(var part in parts) { 
        mainPart.Document.Body.Append((OpenXmlElement)part); 
       } 

       /* Save the results and close */ 
       mainPart.Document.Save(); 
       myDoc.Close(); 
      } 
     } 

有没有人知道问题可能是什么(或如何正确地复制一个部分从一个文件到另一个)?

+0

在OpenXml SDK中有类似的东西吗? – jle 2011-01-11 16:51:33

回答

1

我已经在这方面做了一些工作,而且我发现无价之宝在于将已知的优秀文件与预期文件进行比较;错误通常相当明显。

我会做的是拿一个你知道有效的文件,并将所有的部分复制到模板中。理论上,这两个文件应该是相同的。在它们的docx文件内的document.xml中运行diff,您将看到不同之处。

顺便说一句,我假设你知道docx实际上是一个zip;将扩展名更改为“zip”,并且您将能够获得组成该格式的实际XML文件。

就diff工具而言,我使用Scooter软件的Beyond Compare。

+2

Open XML SDK 2.0生产力工具内置diff选项作为另一选项。 – amurra 2011-01-19 13:38:43

1

沿着你正在做的行的方法只适用于简单的文件(即那些不包含图像,超链接,评论等)。要处理这些更复杂的文档,请查看http://blogs.msdn.com/b/ericwhite/archive/2009/02/05/move-insert-delete-paragraphs-in-word-processing-documents-using-the-open-xml-sdk.aspx以及生成的DocumentBuilder API(CodePlex上的PowerTools for Open XML项目的一部分)。

为了使用DocumentBuilder将docx分成多个部分,您仍然需要先找到包含sectPr元素的段落的索引。

相关问题