Abrufen des Inhalts eines Dokumentteils aus einem Paket

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um den Inhalt eines Dokumentteils in einem Wordprocessing-Dokument programmgesteuert abzurufen.


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 (Visual Basic .NET Shared-Methode oder statische C#-Methode) der WordprocessingDocument-Klasse übergibt, die eine Zeichenfolge und einen booleschen Wert akzeptiert, der angibt, ob die Datei im Lese-/Schreibmodus geöffnet werden soll oder nicht. In diesem Fall ist der boolesche Wert false und gibt an, dass die Datei im schreibgeschützten Modus geöffnet werden soll, um versehentliche Änderungen zu vermeiden.

    // Open a Wordprocessing document for editing.
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
    {
          // 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.


Comments-Element

In diesem Artikel vom Typ "Gewusst wie" verwenden Sie Kommentare. Daher ist es hilfreich, sich mit der Struktur des <Comments-Elements> vertraut zu machen. Die folgenden Informationen aus der SPEZIFIKATION ISO/IEC 29500 können bei der Arbeit mit diesem Element nützlich sein.

Dieses Element gibt alle im aktuellen Dokument definierten Kommentare an. Es ist das Stammelement des Kommentarteils eines WordprocessingML-Dokuments. Betrachten Sie das folgende WordprocessingML-Fragment für den Inhalt eines Kommentarteils in einem WordprocessingML-Dokument:

    <w:comments>
      <w:comment … >
        …
      </w:comment>
    </w:comments>

Das comments-Element enthält den einzelnen Kommentar, der durch dieses Dokument in diesem Beispiel angegeben ist.

© ISO/IEC29500: 2008.

Mit dem folgenden XML-Schemafragment wird der Inhalt dieses Elements definiert.

    <complexType name="CT_Comments">
       <sequence>
           <element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/>
       </sequence>
    </complexType>

Funktionsweise des Beispielcodes

Nachdem Sie die Quelldatei zum Lesen geöffnet haben, erstellen Sie ein mainPart-Objekt durch das Instanziieren des MainDocumentPart-Objekts. Anschließend können Sie einen Verweis auf den WordprocessingCommentsPart-Teil des Dokuments erstellen.

    // To get the contents of a document part.
    public static string GetCommentsFromDocument(string document)
    {
        string comments = null;

        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
        {
            MainDocumentPart mainPart = wordDoc.MainDocumentPart;
            WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart;

Sie können ein StreamReader-Objekt verwenden, um den Inhalt des WordprocessingCommentsPart-Teils des Dokuments zu lesen und den Inhalt zurückzugeben.

    using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
            {
                comments = streamReader.ReadToEnd();
            }
        }
        return comments;

Beispielcode

Im folgenden Code rufen Sie den Inhalt eines WordprocessingCommentsPart-Teils ab, der in einem WordProcessing-Dokumentpaket enthalten ist. Sie können das Programm durch Aufrufen der GetCommentsFromDocument-Methode wie im folgenden Beispiel zu sehen ausführen.

    string document = @"C:\Users\Public\Documents\MyPkg5.docx";
    GetCommentsFromDocument(document);

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


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

GetCommentsFromDocument(args[0]);

// To get the contents of a document part.
static string GetCommentsFromDocument(string document)
{
    string? comments = null;

    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
    {
        if (wordDoc is null)
        {
            throw new ArgumentNullException(nameof(wordDoc));
        }

        MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();
        WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart ?? mainPart.AddNewPart<WordprocessingCommentsPart>();

        using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
        {
            comments = streamReader.ReadToEnd();
        }
    }

    return comments;
}

Siehe auch

Referenz zur Open XML SDK-Klassenbibliothek