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 ISO/IEC 29500 definiert wird. 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 der übergibt, die WordprocessingDocument 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 gibt true
der boolesche Wert an, dass die Datei im Lese-/Schreibmodus geöffnet werden soll.
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
Mit v3.0.0 und höher wurde die Close() -Methode entfernt, um sich auf die using-Anweisung zu verlassen.
Dadurch wird sichergestellt, dass die Dispose() -Methode automatisch aufgerufen wird, wenn die schließende Klammer erreicht ist. Der Block, der auf die using-Anweisung folgt, richtet einen Bereich für das Objekt ein, das in der using-Anweisung erstellt oder benannt wird. Da die WordprocessingDocument -Klasse im Open XML SDK das Objekt als Teil der IDisposable Implementierung automatisch speichert und schließt und da Dispose() automatisch aufgerufen wird, wenn Sie den Block beenden, müssen Sie oder Dispose() nicht explizit aufrufenSave(), solange Sie eine using
-Anweisung verwenden.
Struktur eines WordProcessingML-Dokuments
Die grundlegende Dokumentstruktur eines WordProcessingML
Dokuments besteht aus den document
Elementen und body
gefolgt von einem oder mehreren Elementen auf Blockebene, z p
. B. , die einen Absatz darstellen. Ein Absatz enthält mindestens ein r
Element. Steht r
für "run", bei dem es sich um einen Textbereich mit einem gemeinsamen Satz von Eigenschaften handelt, z. B. formatierung. Eine Ausführung enthält mindestens ein t
Element. 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="http://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 mithilfe stark typisierter Klassen erstellen, die Elementen entsprechen WordprocessingML
. Sie finden diese Klassen im -Namespace. In der folgenden Tabelle sind die Klassennamen der Klassen aufgeführt, die den document
Elementen , body
, p
, r
und t
entsprechen.
WordprocessingML-Element | Open XML SDK-Klasse | Beschreibung |
---|---|---|
<document/> |
Document | Das Stammelement des Hauptdokumentteils. |
<body/> |
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 eine neue benutzerdefinierte XML-Komponente hinzu. Anschließend wird der Inhalt der externen Datei gelesen, die den benutzerdefinierten XML-Code enthält, 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 ?? wordDoc.AddMainDocumentPart();
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, in dem eine Datei durch Hinzufügen eines neuen Dokumentteils geändert wird.
string document = args[0];
string fileName = args[1];
AddNewPart(args[0], args[1]);
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.
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);
}
}
}