2016-06-08 6 views
0

Ist es möglich, ein Word-Dokumentelement mit OpenXML zu duplizieren, ohne Probleme mit der "doppelten ID"?Duplizierung mit OpenXML (Word-Dokument) und ID-Problemen

Eigentlich zu duplizieren, klonen ich die Elemente innerhalb des Körpers und anfügen die geklonten Elemente in den Körper. Aber wenn irgendein Element eine ID hat, habe ich Fehler, wenn ich das Dokument in Word öffne. Hier

ist ein Beispiel für Fehler von OpenXML-Validator:

  • [60] Description = ". Attribut 'id' sollte eindeutigen Wert hat Seinen aktuellen Wert 'Rechteck 11' Duplikate mit anderen"

Und hier ist mein Code:

 Document document = wordDocument.MainDocumentPart.Document; 
     Body body = document.Body; 
     IEnumerable<OpenXmlElement> elements = ((Body)body.CloneNode(true)).Elements(); 

     foreach (var element in elements) 
     { 
      OpenXmlElement e = (OpenXmlElement)element.CloneNode(true); 

      body.AppendChild(e);    
     } 

Antwort

0

Sie können nicht nur Elemente mit einer ID zu kopieren, Sie haben auch Teile zu duplizieren (Suche OpenXmlPart für weitere Informationen).

Sie können dies tun, indem Funktionen AddPart() und GetIdOfPart() (erreichbar von MainDocumentPart) Vereinigen

Erster Versuch: wenn Sie ein Element mit einer ID, verwenden AddPart(OpenXmlPart part) das Element Teil hinzuzufügen und rufen Sie die neu generierte id des Teils mit GetIdOfPart(OpenXmlPart part)

Danach können Sie in Ihrer geklonten OpenXmlElement die ID durch die neuen

ersetzen Zweiter Versuch: oder man könnte eine andere Art und Weise vorstellen, wie:

  • prüfen höchste id bestehender Teile (und speichern)
  • Clone alle Teile von Anfang an und wählen Sie sich die ID (durch die Zugabe von höchste gespeichert id)
  • Wenn Sie jedes Element kopieren und eine ID finden, fügen Sie die gespeicherte höchste ID mit dem neuen Teil

ich hoffe, dass eine dieser Art und Weise zu entsprechen, werden Ihnen helfen, aber auf jeden Fall werden Sie müssen Teile klonen

+0

Sie irgendein Beispiel haben Sie bitte? Ich weiß nicht wirklich, wie man die ID eines Elements ändert. Und zu den Teilen muss ich nur AddPart (e) in meinem Fall? –

+0

Sie müssen eine Kopie des Teils hinzufügen (mit AddPart), die neue ID des kopierten Teils abrufen (mit GetIdOfPart) und die ID im kopierten Element ersetzen. Um die ID zu ersetzen, müssen Sie Ihr Element überprüfen (transformieren Sie Ihr OpenXmlElement in das reale Objekt und verwenden Sie die Id-Eigenschaft, um die neue ID zu beeinflussen. –

+0

Welchen Teil muss ich kopieren? Da ich über eine Liste von openxmlelement iteriere? Ich weiß wirklich nicht, wie es geht. –

0

DocIO ist eine .NET-Klassenbibliothek, die Microsoft Word-Dokumente lesen, schreiben und rendern kann. Mit DocIO können Sie die Elemente wie Absatz, Tabelle, Textlauf oder das gesamte Dokument klonen und an die gewünschte Stelle anhängen.

Die ganze Reihe von Kontrollen ist kostenlos (kommerzielle Anwendungen auch) durch die community license program, wenn Sie qualifizieren. Die Community-Lizenz ist das vollständige Produkt ohne Einschränkungen oder Wasserzeichen.

Hiermit haben wir ein einfaches Beispiel Code-Snippet, die alle Absätze und Tabellen im Dokumentkörper klonen und sie am Ende des gleichen Dokuments anhängen.

using Syncfusion.DocIO.DLS; 

namespace DocIO_Clone 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     using (WordDocument document = new WordDocument(@"InputWordFile.docx")) 
     { 
      int sectionCount = document.Sections.Count; 
      for (int i = 0; i < sectionCount; i++) 
      { 
       IWSection section = document.Sections[i]; 
       int entityCount = section.Body.ChildEntities.Count; 
       for (int j = 0; j < entityCount; j++) 
       { 
        IEntity entity = section.Body.ChildEntities[j]; 
        switch(entity.EntityType) 
        { 
         case EntityType.Paragraph: 
          IWParagraph paragraph = entity.Clone() as IWParagraph; 
          document.LastSection.Body.ChildEntities.Add(paragraph); 
          break; 
         case EntityType.Table: 
          IWTable table = entity.Clone() as IWTable; 
          document.LastSection.Body.ChildEntities.Add(table); 
          break; 

        } 
       } 
      } 
      document.Save("ResultDocument.docx"); 
     } 
    } 
} 
} 

Weitere Informationen finden Sie auf unseren help documentation

Hinweis sehen: Ich arbeite für Syncfusion