Erstellen eines Pakets

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um programmgesteuert ein Textverarbeitungsdokumentpaket aus Inhalten in Form von WordprocessingML XML-Markup zu erstellen.

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

Im Open XML SDK stellt die WordprocessingDocument -Klasse ein Word-Dokumentpaket dar. Zum Erstellen eines Word-Dokuments müssen Sie eine Instanz der WordprocessingDocument-Klasse erstellen und sie mit Teilen auffüllen. Das Dokument muss mindestens einen Hauptdokumentteil aufweisen, der als Container für den Haupttext des Dokuments dient. Der Text wird im Paket mithilfe von WordprocessingML-Markup als XML dargestellt.

Sie rufen zum Erstellen der Klasseninstanz die Create(String, WordprocessingDocumentType)-Methode auf. Es werden mehrere Create-Methoden mit einer jeweils anderen Signatur bereitgestellt. Der Beispielcode in diesem Thema verwendet die Create-Methode mit einer Signatur, die zwei Parameter erfordert. Der erste Parameter erfordert eine vollständige Pfadzeichenfolge, die das Dokument darstellt, das Sie erstellen möchten. Der zweite Parameter ist ein Member der WordprocessingDocumentType-Enumeration. Dieser Parameter steht für den Typ des Dokuments. Es gibt beispielsweise einen anderen Member der WordProcessingDocumentType-Enumeration für jedes Dokument, jede Vorlage und jedes Makro für die unterschiedlichen Dokumente und Vorlagen.

Hinweis

[!HINWEIS] Wählen Sie den entsprechenden WordProcessingDocumentType sorgfältig aus, und stellen Sie sicher, dass die dauerhaft gespeicherte Datei über die ordnungsgemäße passende Dateinamenerweiterung verfügt. Wenn der WordProcessingDocumentType nicht der Dateinamenerweiterung entspricht, tritt beim Öffnen der Datei in Microsoft Word ein Fehler auf. Der Code, der die Create-Methode aufruft, ist Teil einer using-Anweisung, auf die ein Block in Klammern folgt (siehe das folgende Codebeispiel).

    using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
    {
       // Insert other code here. 
    }

Die using-Anweisung ist eine empfohlene Alternative zur herkömmlichen Reihenfolge ".Create, .Save, .Close". Sie stellt sicher, dass die Dispose()-Methode (vom Open XML SDK verwendete interne Methode zum Bereinigen von Ressourcen) bei Erreichen der schließenden Klammer automatisch aufgerufen wird. 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 automatisch als Teil seiner System.IDisposable-Implementierung speichert und schließt und Dispose automatisch aufgerufen wird, wenn Sie den Block in Klammern verlassen, müssen Save und Close nicht explizit aufgerufen werden, solange Sie using verwenden.

Sobald Sie das Word-Dokumentpaket erstellt haben, können Sie ihm Teile hinzufügen. Rufen Sie zum Hinzufügen des Hauptdokumentteils die AddMainDocumentPart() -Methode der WordprocessingDocument-Klasse auf. Im Anschluss können Sie die Dokumentstruktur und Text hinzufügen.

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.

Beispielcode

Es folgt das vollständige Codebeispiel, mit dem Sie ein Open XML-Textverarbeitungsdokument-Paket aus XML-Inhalt in Form von WordprocessingML-Markup erstellen können. Sie können im Programm die CreateNewWordDocument-Methode mithilfe des folgenden Aufrufs aufrufen:

    CreateNewWordDocument(@"C:\Users\Public\Documents\MyPkg4.docx");

Nachdem Sie das Programm ausgeführt haben, öffnen Sie die erstellte Datei "myPkg4.docx", und untersuchen Sie deren Inhalt. Es sollte ein Absatz sein, der den Ausdruck "Hello world!" enthält.

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


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

CreateNewWordDocument(args[0]);

// To create a new package as a Word document.
static void CreateNewWordDocument(string document)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
    {
        // Set the content of the document so that Word can open it.
        MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();

        SetMainDocumentContent(mainPart);
    }
}

// Set the content of MainDocumentPart.
static void SetMainDocumentContent(MainDocumentPart part)
{
    const string docXml = @"<?xml version=""1.0"" encoding=""utf-8""?>
                            <w:document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
                              <w:body>
                                <w:p>
                                  <w:r>
                                    <w:t>Hello World</w:t>
                                  </w:r>
                                </w:p>
                              </w:body>
                            </w:document>";

    using (Stream stream = part.GetStream())
    {
        byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
        stream.Write(buf, 0, buf.Length);
    }
}