Öffnen eines Textverarbeitungsdokuments aus einem Stream
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um ein Word Dokument aus einem Stream programmgesteuert zu öffnen.
Szenario zum Öffnen eines Dokuments aus einem Stream
Wenn Sie über eine Anwendung verfügen, z. B. eine SharePoint-Anwendung, die mit Dokumenten mit Datenstromeingabe/-ausgabe funktioniert, und Sie das Open XML SDK verwenden möchten, um mit einem der Dokumente zu arbeiten, ist dies einfach. Dies gilt insbesondere, wenn das Dokument vorhanden ist und Sie es mit dem Open XML SDK öffnen können. Doch angenommen, das Dokument ist ein geöffneter Stream an der Stelle in Ihrem Code, an dem Sie das SDK zum Arbeiten mit dem Dokument nutzen möchten. Dies ist das Szenario in diesem Thema. Die Beispielmethode im Beispielcode akzeptiert einen offenen Stream als Parameter und fügt dann mithilfe des Open XML SDK Text zum Dokument hinter dem Stream hinzu.
Erstellen eines WordprocessingDocument-Objekts
Im Open XML SDK stellt die WordprocessingDocument -Klasse ein Word-Dokumentpaket dar. Um mit einem Word Dokument zu arbeiten, erstellen Sie zunächst eine instance der WordprocessingDocument -Klasse aus dem Dokument, und arbeiten Sie dann mit diesem instance. Wenn Sie die Instanz anhand des Dokuments erstellen, können Sie anschließend Zugriff auf den Hauptdokumentteil erhalten, der den Text des Dokuments enthält. Jedes Open XML-Paket enthält eine gewisse Anzahl von Teilen. Ein muss mindestens einen Standard Dokumentteil enthalten, WordprocessingDocument der als Container für den Standard Text des Dokuments fungiert. Das Paket kann auch zusätzliche Teile enthalten. Beachten Sie, dass in einem Word Dokument der Text im Standard Dokumentteil im Paket mithilfe von WordprocessingML
Markup als XML dargestellt wird.
Um die Klasse instance aus dem Dokument zu erstellen, rufen Sie die -Methode aufOpen(Stream, Boolean). Es werden mehrere Open
Methoden mit jeweils unterschiedlicher Signatur bereitgestellt. Der Beispielcode in diesem Thema verwendet die Open
-Methode mit einer Signatur, die zwei Parameter erfordert. Der erste Parameter verwendet ein Handle des Streams, in dem Sie das Dokument öffnen möchten. Der zweite Parameter ist oder true
false
und gibt an, ob der Stream zur Bearbeitung geöffnet wird.
Im folgenden Codebeispiel wird die Open
-Methode aufgerufen.
// Open a WordProcessingDocument based on a stream.
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true))
{
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 Öffnen des Word-Dokumentpakets können Sie dem Hauptdokumentteil Text hinzufügen. Um auf den Textkörper des Standard Dokumentteils zuzugreifen, weisen Sie einen Verweis auf den Dokumenttext zu, wie im folgenden Codesegment gezeigt.
// Assign a reference to the document body.
MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
Wenn Sie auf den Text des Standard Dokumentteils zugreifen, fügen Sie Text hinzu, indem Sie Instanzen der ParagraphKlassen , Runund Text hinzufügen. Dadurch wird das erforderliche WordprocessingML
Markup generiert. Im folgenden Codebeispiel werden Absatz, Lauf und Text hinzugefügt.
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
Beispielcode
Die hier gezeigte Beispielmethode OpenAndAddToWordprocessingStream
kann verwendet werden, um ein Word Dokument aus einem bereits geöffneten Stream zu öffnen und Text mithilfe des Open XML SDK anzufügen. Sie können die Methode aufrufen, indem Sie als ersten Parameter ein Handle an einen geöffneten Stream und als zweiten Parameter den hinzuzufügenden Text übergeben. Im folgenden Codebeispiel wird beispielsweise die im ersten Argument angegebene Datei geöffnet und ihr Text aus dem zweiten Argument hinzugefügt.
string filePath = args[0];
string txt = args[1];
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
OpenAndAddToWordprocessingStream(fileStream, txt);
}
Hinweis
Beachten Sie, dass die OpenAddAddToWordprocessingStream
Methode den an sie übergebenen Stream nicht schließt. Der aufrufende Code muss dazu den Methodenaufruf in einer using
-Anweisung umschließen oder explizit Dispose aufrufen.
Nachstehend ist der vollständige Beispielcode in C# und Visual Basic aufgeführt.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.IO;
static void OpenAndAddToWordprocessingStream(Stream stream, string txt)
{
// Open a WordProcessingDocument based on a stream.
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true))
{
// Assign a reference to the document body.
MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
}
// Caller must close the stream.
}