Hinzufügen eines neuen Dokumentteils zu einem Paket

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um einem Textverarbeitungsdokument programmgesteuert einen Dokumentteil (Eine Datei) hinzuzufügen.

Pakete und Dokumentteile

Ein Open XML-Dokument wird als Paket gespeichert, dessen Format durch die Spezifikation ISO/IEC 29500-2 definiert ist. Das Paket kann mehrere Teile enthalten, die untereinander in Beziehung stehen. Durch die Beziehung zwischen den Teilen wird die Kategorie des Dokuments gesteuert. Ein Dokument kann als Textverarbeitungsdokument definiert sein, falls sein Paketbeziehungselement eine Beziehung zu einem Hauptdokumentteil besitzt. Falls das Paketbeziehungselement eine Beziehung zu einem Präsentationsteil hat, kann es als Präsentationsdokument definiert sein. Falls das Paketbeziehungselement eine Beziehung zu einem Arbeitsmappenteil hat, ist es als Tabellenkalkulationsdokument definiert. In diesem Thema vom Typ "Gewusst wie" wird ein Textverarbeitungsdokument-Paket verwendet.

Abrufen eines WordprocessingDocument-Objekts

Der Code beginnt mit dem Öffnen einer Paketdatei, indem er einen Dateinamen an eine der überladenen Open() -Methoden des DocumentFormat.OpenXml.Packaging.WordprocessingDocument übergibt , die eine Zeichenfolge und einen booleschen Wert akzeptiert, der angibt, ob die Datei zur Bearbeitung oder für schreibgeschützten Zugriff geöffnet werden soll. In diesem Fall ist der boolesche Wert auf true festgelegt, womit angegeben wird, dass die Datei im Lese-/Schreibmodus geöffnet werden soll.

    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        // Insert other code here.
    }

Die using-Anweisung stellt eine empfohlene Alternative zu der üblichen Sequenz „.Create, .Save, .Close“ dar. Mit dieser wird sichergestellt, dass die Dispose-Methode (interne vom Open XML SDK zum Bereinigen von Ressourcen verwendete Methode) automatisch aufgerufen wird, wenn die schließende Klammer erreicht ist. Der Block, der auf die using-Anweisung folgt, legt einen Bereich für das Objekt fest, das in der using-Anweisung erstellt oder benannt wird, in diesem Fall wordDoc. Da die WordprocessingDocument-Klasse im Open XML SDK das Objekt als Teil der System.IDisposable-Implementierung automatisch speichert und schließt, und weil die Dispose-Methode automatisch aufgerufen wird, wenn Sie den Block beenden. Sie müssen Speichern und Schließen nicht explizit aufrufen, solange Sie verwenden.

Struktur eines WordProcessingML-Dokuments

Die grundlegende Struktur eines WordProcessingML-Dokuments besteht aus den document- und body-Elementen, gefolgt von einem oder mehreren Block-Level-Elementen wie p, das für einen Absatz steht. Ein Absatz enthält ein oder mehrere r-Elemente. r steht für ausführen und meint einen Textbereich mit gemeinsamen Eigenschaften wie Formatierung. Eine Ausführung besteht aus einem oder mehreren t-Elementen. Das t-Element enthält einen Textbereich. Das folgende Codebeispiel zeigt das WordprocessingML-Markup für ein Dokument, das den Text "Beispieltext" enthält.

    <w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:body>
        <w:p>
          <w:r>
            <w:t>Example text.</w:t>
          </w:r>
        </w:p>
      </w:body>
    </w:document>

Mit dem Open XML SDK können Sie Dokumentstrukturen und -inhalte mit stark typisierten Klassen erstellen, die WordprocessingML-Elementen entsprechen. Diese Klassen sind im DocumentFormat.OpenXml.Wordprocessing -Namespace enthalten. Die folgende Tabelle enthält die Namen der Klassen, die den Elementen document, body, p, r und t entsprechen.

WordprocessingML-Element Open XML SDK-Klasse Beschreibung
document Document Das Stammelement des Hauptdokumentteils.
Text Body Der Container für die Strukturen auf Blockebene, z. B. Absätze, Tabellen, Anmerkungen und andere, die in der Spezifikation ISO/IEC 29500 angegeben sind.
p Paragraph Ein Absatz.
r Run Ein Lauf.
t Text Ein Textbereich.

Weitere Informationen zur Gesamtstruktur der Teile und Elemente eines WordprocessingML-Dokuments finden Sie unter Struktur eines WordprocessingML-Dokuments.

Funktionsweise des Beispielcodes

Nach dem Öffnen des Dokuments zur Bearbeitung erstellt der Code in der using-Anweisung als WordprocessingDocument-Objekt einen Verweis auf den MainDocumentPart-Teil und fügt einen neuen benutzerdefinierten XML-Teil hinzu. Dann wird der Inhalt der externen Datei mit dem benutzerdefinierten XML-Code gelesen und in den CustomXmlPart-Teil geschrieben.

Hinweis

Fügen Sie zum Verwenden des neuen Dokumentteils im Dokument im Beziehungsteil des neuen Teils eine Verknüpfung zum Dokumentteil hinzu.

    MainDocumentPart mainPart = wordDoc.MainDocumentPart;
    CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);

    using (FileStream stream = new FileStream(fileName, FileMode.Open))
    {
        myXmlPart.FeedData(stream);
    }

Beispielcode

Im folgenden Code wird ein neuer Dokumentteil hinzugefügt, der benutzerdefinierten XML-Code aus einer externen Datei enthält, und der Teil wird anschließend aufgefüllt. Um die AddCustomXmlPart-Methode in Ihrem Programm aufzurufen, verwenden Sie das folgende Beispiel, das die Datei "myPkg2.docx" ändert, indem Sie ihr einen neuen Dokumentteil hinzufügen.

    string document = @"C:\Users\Public\Documents\myPkg2.docx";
    string fileName = @"C:\Users\Public\Documents\myXML.xml";
    AddNewPart(document, fileName);

Hinweis

Ändern Sie vor Ausführung des Programms die Word-Dateinamenerweiterung von DOCX zu ZIP, und zeigen Sie den Inhalt der ZIP-Datei an. Ändern Sie die Erweiterung dann wieder zurück in DOCX, und führen Sie das Programm aus. Ändern Sie nach Ausführung des Programms die Dateinamenerweiterung wieder zu ZIP, und sehen Sie sich den Inhalt an. Es wird ein zusätzlicher Ordner mit dem Namen "customXML" angezeigt. Dieser Ordner enthält die XML-Datei, die den hinzugefügten Teil darstellt.

Nachstehend ist der vollständige Beispielcode in C# und Visual Basic aufgeführt.


using DocumentFormat.OpenXml.Packaging;
using System.IO;

AddNewPart(args[0], args[1]);

// To add a new document part to a package.
static void AddNewPart(string document, string fileName)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();

        CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);

        using (FileStream stream = new FileStream(fileName, FileMode.Open))
        {
            myXmlPart.FeedData(stream);
        }
    }
}