Freigeben über


Ö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. 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 Hauptdokumentteil mithilfe des WordprocessingML-Markups als XML dargestellt wird.

Um die Klasse instance aus dem Dokument zu erstellen, rufen Sie eine der Open Methoden auf. Es werden mehrere Open Methoden mit jeweils unterschiedlicher Signatur bereitgestellt. 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) Erstellen Sie eine instance der WordprocessingDocument -Klasse aus der angegebenen Datei.
Open(Stream, Boolean) Open(Stream, Boolean) Erstellen Sie eine instance der WordprocessingDocument -Klasse aus dem angegebenen E/A-Stream.
Open(String, Boolean, OpenSettings) Open(String, Boolean, OpenSettings) Erstellen Sie eine instance der WordprocessingDocument -Klasse aus der angegebenen Datei.
Open(Stream, Boolean, OpenSettings) Open(Stream, Boolean, OpenSettings) Erstellen Sie eine instance der WordprocessingDocument -Klasse aus dem angegebenen E/A-Stream.

In der obigen Tabelle sind nur die Open Methoden aufgeführt, die einen booleschen Wert als zweiten Parameter akzeptieren, um anzugeben, ob ein Dokument bearbeitet werden kann. To open a document for read only access, you specify false for this parameter.

Beachten Sie, dass zwei der Open Methoden eine instance der Klasse erstellen, die WordprocessingDocument 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 verwendet false und angegeben, ob Sie die Datei zur Bearbeitung öffnen möchten.

Im folgenden Codebeispiel wird die Open -Methode aufgerufen.

// Open a WordprocessingDocument based on a filepath.
using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filepath, false))

Die anderen beiden Open Methoden erstellen eine instance der WordprocessingDocument -Klasse basierend auf einem Eingabe-/Ausgabestream. Sie können diesen Ansatz für instance verwenden, wenn Sie über eine Microsoft Office SharePoint Online-Anwendung verfügen, die die Datenstromeingabe/-ausgabe verwendet und 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.

// Get a stream of the wordprocessing document
using (FileStream fileStream = new FileStream(filepath, FileMode.Open))

// Open a WordprocessingDocument for read-only access based on a stream.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(fileStream, 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 einen Package als ersten Parameter akzeptieren, gibt es keinen, der einen booleschen Wert als zweiten Parameter annimmt, um anzugeben, ob das Dokument zur Bearbeitung geöffnet werden soll.

Die empfohlene Methode besteht darin, das Paket zunächst schreibgeschützt zu öffnen, bevor Sie die instance der WordprocessingDocument Klasse erstellen, wie im zweiten Beispiel im Beispielcode gezeigt. Im folgenden Codebeispiel wird dieser Vorgang ausgeführt.

// Open System.IO.Packaging.Package.
using (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 or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart ?? wordProcessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();

Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

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 DocumentFormat.OpenXml.Wordprocessing -Namespace. In der folgenden Tabelle sind die Klassennamen der Klassen aufgeführt, die den documentElementen , body, p, rund 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.


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 Standard Dokumentteils haben, 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.

// 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();

Beispielcode

Die erste hier gezeigte Beispielmethode öffnet OpenWordprocessingDocumentReadOnlyein Word Dokument für schreibgeschützten Zugriff. Call it by passing a full path to the file that you want to open. Im folgenden Codebeispiel wird beispielsweise der Dateipfad aus dem ersten Befehlszeilenargument für schreibgeschützten Zugriff geöffnet.

OpenWordprocessingDocumentReadonly(args[0]);

Die zweite Beispielmethode, OpenWordprocessingPackageReadonly, zeigt, wie ein Word Dokument für den schreibgeschützten Zugriff von einem Packagegeöffnet wird. Call it by passing a full path to the file that you want to open. Im folgenden Codebeispiel wird beispielsweise der Dateipfad aus dem ersten Befehlszeilenargument für schreibgeschützten Zugriff geöffnet.

OpenWordprocessingPackageReadonly(args[0]);

Die dritte Beispielmethode, OpenWordprocessingStreamReadonly, zeigt, wie Sie ein Word Dokument für den schreibgeschützten Zugriff aus einem Stream öffnen. Call it by passing a full path to the file that you want to open. Im folgenden Codebeispiel wird beispielsweise der Dateipfad aus dem ersten Befehlszeilenargument für schreibgeschützten Zugriff geöffnet.

OpenWordprocessingStreamReadonly(args[0]);

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.

static void OpenWordprocessingDocumentReadonly(string filepath)
{
    // Open a WordprocessingDocument based on a filepath.
    using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filepath, false))
    {
        if (wordProcessingDocument is null)
        {
            throw new ArgumentNullException(nameof(wordProcessingDocument));
        }

        // Assign a reference to the existing document body or create a new one if it is null.
        MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart ?? wordProcessingDocument.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();
    }
}

static void OpenWordprocessingPackageReadonly(string filepath)
{
    // Open System.IO.Packaging.Package.
    using (Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read))
    // Open a WordprocessingDocument based on a package.
    using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(wordPackage))
    {
        // Assign a reference to the existing document body or create a new one if it is null.
        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 - OpenWordprocessingPackageReadonly"));

        // Call Save to generate an exception and show that access is read-only.
        // mainDocumentPart.Document.Save();
    }
}


static void OpenWordprocessingStreamReadonly(string filepath)
{
    // Get a stream of the wordprocessing document
    using (FileStream fileStream = new FileStream(filepath, FileMode.Open))

    // Open a WordprocessingDocument for read-only access based on a stream.
    using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(fileStream, false))
    {


        // Assign a reference to the existing document body or create a new one if it is null.
        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 - OpenWordprocessingStreamReadonly"));

        // Call Save to generate an exception and show that access is read-only.
        // mainDocumentPart.Document.Save();
    }
}

Siehe auch