2011-01-11 11 views
0

Ich versuche den folgenden Code. Es nimmt einen fileName (docx Datei mit vielen Abschnitten) und ich versuche, durch jeden Abschnitt zu durchlaufen, der den Abschnittnamen erhält. Das Problem ist, dass ich am Ende nicht lesbare docx-Dateien bekomme. Es ist kein Fehler, aber ich denke, ich mache etwas falsch mit den Elementen in der Sektion.OpenXml Sdk - Kopieren von Abschnitten von docx in ein anderes 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(); 
      } 
     } 

Weiß jemand, was das Problem sein könnte (oder wie man einen Abschnitt von einem Dokument in einen anderen korrekt kopiert)?

+0

Gibt es gute Beispiele für ähnliche Dinge in OpenXml SDK? – jle

Antwort

1

Ich habe in diesem Bereich etwas Arbeit geleistet, und was ich unschätzbar wertvoll fand, ist eine bekannte gute Datei mit einer potenziellen Datei zu diffundieren; Der Fehler ist normalerweise ziemlich offensichtlich.

Was ich tun würde, ist eine Datei, die Sie wissen, funktioniert, und kopieren Sie alle Abschnitte in die Vorlage. Theoretisch sollten die zwei Dateien identisch sein. Führen Sie ein diff auf ihnen die document.xml in der docx-Datei, und Sie werden den Unterschied sehen.

BTW, ich nehme an, dass Sie wissen, dass das docx eigentlich ein zip ist; Ändern Sie die Erweiterung in "zip", und Sie werden in der Lage sein, auf die tatsächlichen XML-Dateien zuzugreifen, die das Format bilden.

Soweit diff Tools, verwende ich Beyond Compare von Scooter Software.

+2

Das Open XML SDK 2.0 Productivity Tool verfügt über eine integrierte Diff-Option als weitere Option. – amurra

1

Ein Ansatz in der Art, wie Sie vorgehen, funktioniert nur für einfache Dokumente (dh solche, die keine Bilder, Hyperlinks, Kommentare usw. enthalten). Um diese komplexeren Dokumente zu behandeln, werfen Sie einen Blick auf http://blogs.msdn.com/b/ericwhite/archive/2009/02/05/move-insert-delete-paragraphs-in-word-processing-documents-using-the-open-xml-sdk.aspx und die resultierende DocumentBuilder-API (Teil des PowerTools für Open XML-Projekts auf CodePlex).

Um ein docx in Abschnitte unter Verwendung von DocumentBuilder aufzuteilen, müssen Sie immer noch den Index der Absätze finden, die sectPr Elemente enthalten.

Verwandte Themen