Öffnen eines Textverarbeitungsdokuments mit Schreibschutz
In diesem Thema wird beschrieben, wie Die Klassen im Open XML SDK für Office zum programmgesteuerten Öffnen eines Textverarbeitungsdokuments für schreibgeschützten Zugriff verwendet werden.
Öffnen eines Dokuments mit Schreibschutz
Mitunter möchten Sie ein Dokument öffnen, um bestimmte Informationen zu untersuchen oder abzurufen, aber gleichzeitig sicherstellen, dass das Dokument unverändert bleibt. In diesen Fällen kann das Dokument schreibgeschützt geöffnet werden. In diesem Thema vom Typ "Gewusst wie" werden verschiedene Möglichkeiten zum Öffnen eines Textverarbeitungsdokuments mit Schreibschutz vorgestellt.
Erstellen eines WordprocessingDocument-Objekts
Im Open XML SDK stellt die WordprocessingDocument -Klasse ein Word-Dokumentpaket dar. Zum Arbeiten mit einem Word-Dokument müssen Sie zuerst anhand des Dokuments eine Instanz der WordprocessingDocument-Klasse erstellen und anschließend mit dieser Instanz arbeiten. 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 WordProcessingDocument-Objekt muss mindestens einen Hauptdokumentteil enthalten, der als Container für den Haupttext des Dokuments verwendet wird. Das Paket kann auch zusätzliche Teile enthalten. Beachten Sie, dass in einem Word-Dokument der Text im Hauptdokumentteil mithilfe des WordprocessingML-Markups als XML dargestellt wird.
Zum Erstellen der Klasseninstanz anhand des Dokuments rufen Sie eine der Open-Methoden auf. Es stehen verschiedene Open-Methoden mit einer jeweils anderen Signatur zur Verfügung. Die Methoden, die Ihnen die Angabe ermöglichen, ob ein Dokument bearbeitet werden kann, sind in der folgenden Tabelle enthalten:
Open-Methode | Thema in der Klassenbibliotheksreferenz | Beschreibung |
---|---|---|
Open(String, Boolean) | Open(String, Boolean) | Erstellt eine Instanz der WordprocessingDocument-Klasse anhand der angegebenen Datei. |
Open(Stream, Boolean) | Open(Stream, Boolean) | Erstellt eine Instanz der WordprocessingDocument-Klasse anhand des angegebenen E/A-Datenstroms. |
Open(String, Boolean, OpenSettings) | Open(String, Boolean, OpenSettings) | Erstellt eine Instanz der WordprocessingDocument-Klasse anhand der angegebenen Datei. |
Open(Stream, Boolean, OpenSettings) | Open(Stream, Boolean, OpenSettings) | Erstellt eine Instanz der WordprocessingDocument-Klasse anhand des angegebenen E/A-Datenstroms. |
The table above lists only those Open methods that accept a Boolean value as the second parameter to specify whether a document is editable. To open a document for read only access, you specify false for this parameter.
Beachten Sie, dass zwei der Open-Methoden eine instance der WordprocessingDocument-Klasse erstellen, die auf einer Zeichenfolge als ersten Parameter basiert. Das erste Beispiel im Beispielcode veranschaulicht diese Technik. Es wird die erste Open-Methode in der obigen Tabelle verwendet. mit einer Signatur, die zwei Parameter erfordert. Der erste Parameter akzeptiert eine Zeichenfolge, die den vollständigen Dateinamen des Pfads darstellt, aus dem Sie das Dokument öffnen möchten. Der zweite Parameter ist entweder true oder false. In diesem Beispiel wird false verwendet und gibt an, ob Sie die Datei zur Bearbeitung öffnen möchten.
Im folgenden Codebeispiel wird die Open-Methode aufgerufen.
// Open a WordprocessingDocument for read-only access based on a filepath.
using (WordprocessingDocument wordDocument =
WordprocessingDocument.Open(filepath, false))
Die beiden anderen Open-Methoden erstellen eine Instanz der WordprocessingDocument-Klasse basierend auf einem Eingabe-/Ausgabe-Datenstrom. Sie können diesen Ansatz für instance verwenden, wenn Sie über eine Microsoft SharePoint Foundation 2010-Anwendung verfügen, die die Datenstromeingabe/-ausgabe verwendet, und Sie das Open XML SDK für die Arbeit mit einem Dokument verwenden möchten.
Im folgenden Codebeispiel wird ein Dokument basierend auf einem Datenstrom geöffnet.
Stream stream = File.Open(strDoc, FileMode.Open);
// Open a WordprocessingDocument for read-only access based on a stream.
using (WordprocessingDocument wordDocument =
WordprocessingDocument.Open(stream, false))
Angenommen, Sie verfügen über eine Anwendung, die die Open XML-Unterstützung im System.IO.Packaging-Namespace der .NET Framework Klassenbibliothek verwendet, und Sie möchten das Open XML SDK verwenden, um mit einem schreibgeschützten Paket zu arbeiten. Während das Open XML SDK Methodenüberladungen enthält, die ein Package als ersten Parameter akzeptieren, gibt es keinen, der einen booleschen Wert als zweiten Parameter verwendet, um anzugeben, ob das Dokument zur Bearbeitung geöffnet werden soll.
Die empfohlene Vorgehensweise ist, das Paket zuerst mit Schreibschutz zu öffnen, bevor die Instanz der WordprocessingDocument-Klasse erstellt wird (siehe das zweite Beispiel im Beispielcode). Im folgenden Codebeispiel wird dieser Vorgang ausgeführt.
// Open System.IO.Packaging.Package.
Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read);
// Open a WordprocessingDocument based on a package.
using (WordprocessingDocument wordDocument =
WordprocessingDocument.Open(wordPackage))
Nach dem Öffnen des Word-Dokumentpakets können Sie auf den Hauptdokumentteil zugreifen. Wenn Sie auf den Text des Hauptdokumentteils zugreifen möchten, weisen Sie dem vorhandenen Dokumenttext einen Verweis zu (siehe das folgende Codebeispiel).
// Assign a reference to the existing document body.
Body body = wordprocessingDocument.MainDocumentPart.Document.Body;
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.
Generieren des WordprocessingML-Markups zum Hinzufügen von Text und Versuch der Speicherung
Der Beispielcode veranschaulicht, wie Sie Text hinzufügen und versuchen können, die Änderungen zu speichern, um zu zeigen, dass der Zugriff schreibgeschützt ist. Sobald Sie Zugriff auf den Text des Hauptdokumentteils haben, können Sie Text hinzufügen, indem Sie Instanzen der Klassen Paragraph, Run und Text hinzufügen. Dadurch wird das erforderliche WordprocessingML-Markup generiert. Im folgenden Codebeispiel werden Absatz, Lauf und Text hinzugefügt.
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));
// Call Save to generate an exception and show that access is read-only.
wordDocument.MainDocumentPart.Document.Save();
Beispielcode
The first example method shown here, OpenWordprocessingDocumentReadOnly, opens a Word document for read-only access. Call it by passing a full path to the file that you want to open. For example, the following code example opens the Word12.docx file in the Public Documents folder for read-only access.
OpenWordprocessingDocumentReadonly(@"c:\Users\Public\Public Documents\Word12.docx");
The second example method, OpenWordprocessingPackageReadonly, shows how to open a Word document for read-only access from a System.IO.Packaging.Package. Call it by passing a full path to the file that you want to open. For example, the following code opens the Word12.docx file in the Public Documents folder for read-only access.
OpenWordprocessingPackageReadonly(@"c:\Users\Public\Public Documents\Word12.docx");
Wichtig
[!WICHTIG] Falls Sie die Anweisung zum Speichern der Datei auskommentieren, gibt das Programm eine Ausnahme vom Typ IOException aus, da die Datei mit Schreibschutz geöffnet ist.
Es folgt der vollständige Beispielcode in C# und VB.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
OpenWordprocessingDocumentReadonly(args[0]);
static void OpenWordprocessingDocumentReadonly(string filepath)
{
// Open a WordprocessingDocument based on a filepath.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(filepath, false))
{
if (wordDocument is null)
{
throw new ArgumentNullException(nameof(wordDocument));
}
// Assign a reference to the existing document body.
MainDocumentPart mainDocumentPart = wordDocument.MainDocumentPart ?? wordDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));
// Call Save to generate an exception and show that access is read-only.
//mainDocumentPart.Document.Save();
}
}