Freigeben über


Öffnen eines Kalkulationstabellendokuments mit Schreibschutz

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um ein Tabellenkalkulationsdokument für den schreibgeschützten Zugriff programmgesteuert zu öffnen.


Gründe für das Ö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 soll das Dokument schreibgeschützt geöffnet werden. In dieser Anleitung werden verschiedene Möglichkeiten vorgestellt, ein Tabellenkalkulationsdokument mit Schreibschutz zu öffnen.


Abrufen eines SpreadsheetDocument-Objekts

Im Open XML SDK stellt die SpreadsheetDocument -Klasse ein Excel-Dokumentpaket dar. Zum Erstellen eines Excel-Dokuments müssen Sie eine Instanz der SpreadsheetDocument-Klasse erstellen und sie mit Teilen auffüllen. Das Dokument muss mindestens einen Arbeitsmappenteil, der als Container des Dokuments dient, und mindestens einen Arbeitsblattteil aufweisen. Der Text im Paket wird mithilfe der Markupsprache SpreadsheetML als XML dargestellt.

Zum Erstellen der Klasseninstanz anhand des Dokuments rufen Sie eine der Open() -Methodenüberladungen 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:

Öffnen Thema in der Klassenbibliotheksreferenz Beschreibung
Open(String, Boolean) Open(String, Boolean) Erstellt eine Instanz der SpreadsheetDocument-Klasse anhand der angegebenen Datei.
Open(Stream, Boolean) Open(Stream, Boolean Erstellt eine Instanz der SpreadsheetDocument-Klasse anhand des angegebenen E/A-Streams.
Open(String, Boolean, OpenSettings) Open(String, Boolean, OpenSettings) Erstellt eine Instanz der SpreadsheetDocument-Klasse anhand der angegebenen Datei.
Open(Stream, Boolean, OpenSettings) Open(Stream, Boolean, OpenSettings) Erstellt eine Instanz der SpreadsheetDocument-Klasse anhand des angegebenen E/A-Streams.

In der vorherigen Tabelle in diesem Thema sind nur die Open-Methoden enthalten, die als zweiten Parameter einen booleschen Wert akzeptieren, der angibt, ob ein Dokument bearbeitbar ist. Geben Sie zum Öffnen eines Dokuments mit Schreibschutz False für diesen Parameter an.

Beachten Sie, dass zwei der Open-Methoden eine Instanz der SpreadsheetDocument-Klasse basierend auf einer Zeichenfolge als erstem Parameter erstellen. Das erste Beispiel im Beispielcode veranschaulicht diese Technik. Es verwendet die Open-Methode in der vorherigen Tabelle in diesem Thema mit einer Signatur, die zwei Parameter erfordert. Der erste Parameter verwendet eine Zeichenfolge, die den vollständigen Pfad- und Dateinamen darstellt, den Sie zum Öffnen des Dokuments verwenden möchten. Der zweite Parameter ist entweder true oder false. In diesem Beispiel wird false verwendet und angegeben, dass Sie die Datei schreibgeschützt öffnen möchten.

Im folgenden Codebeispiel wird die Open-Methode aufgerufen.

// Open a SpreadsheetDocument based on a file path.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))

Die beiden anderen Open-Methoden erstellen eine Instanz der SpreadsheetDocument-Klasse basierend auf einem Eingabe-/Ausgabe-Stream. Sie können diesen Ansatz z. B. 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.

// Open a SpreadsheetDocument based on a stream.
Stream stream = File.Open(filePath, FileMode.Open);

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))

Angenommen, Sie haben 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 Paket schreibgeschützt 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 SpreadsheetDocument-Klasse erstellt wird (siehe das zweite Beispiel im Beispielcode). Im folgenden Codebeispiel wird dieser Vorgang ausgeführt.

// Open System.IO.Packaging.Package.
Package spreadsheetPackage = Package.Open(filePath, FileMode.Open, FileAccess.Read);

// Open a SpreadsheetDocument based on a package.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(spreadsheetPackage))

Grundlegende Dokumentstruktur

Die grundlegende Struktur eines SpreadsheetML-Dokuments besteht aus den Sheets- und Sheet-Elementen, die auf Arbeitsblätter in der Arbeitsmappe verweisen. Es wird eine separate XML-Datei für jedes Arbeitsblatt erstellt. Beispiel: SpreadsheetML für eine Arbeitsmappe, die zwei Arbeitsblätter „MySheet1“ und „MySheet2“ enthält, befindet sich in der Datei „Workbook.xml“ und wird im folgenden dargestellt.

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
    <workbook xmlns=https://schemas.openxmlformats.org/spreadsheetml/2006/main xmlns:r="https://schemas.openxmlformats.org/officeDocument/2006/relationships">
        <sheets>
            <sheet name="MySheet1" sheetId="1" r:id="rId1" /> 
            <sheet name="MySheet2" sheetId="2" r:id="rId2" /> 
        </sheets>
    </workbook>

Die Arbeitsblatt-XML-Dateien enthalten ein oder mehrere Block-Level-Elemente wie SheetData. sheetData steht für die Zellentabelle und enthält eine oder mehrere Row-Elemente. Eine Zeile enthält ein oder mehrere Cell-Elemente. Jede Zelle enthält ein CellValue-Element, das den Wert der Zelle darstellt. Beispiel: SpreadsheetML für das erste Arbeitsblatt in einer Arbeitsmappe, das nur den Wert „100“ in Zelle A1 aufweist, befindet sich in der Datei „Sheet1.xml“ und sieht wie folgt aus.

    <?xml version="1.0" encoding="UTF-8" ?> 
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <sheetData>
            <row r="1">
                <c r="A1">
                    <v>100</v> 
                </c>
            </row>
        </sheetData>
    </worksheet>

Mit dem Open XML SDK können Sie Dokumentstrukturen und Inhalte erstellen, die stark typisierte Klassen verwenden, die SpreadsheetML-Elementen entsprechen. Diese Klassen sind im DocumentFormat.OpenXML.Spreadsheet-Namespace enthalten. Die folgende Tabelle enthält die Namen der Klassen, die den Elementen workbook, sheets, sheet, worksheet und sheetData entsprechen.

SpreadsheetML-Element Open XML SDK-Klasse Beschreibung
Arbeitsmappe DocumentFormat.OpenXml.Spreadsheet.Workbook Das Stammelement des Hauptdokumentteils.
sheets DocumentFormat.OpenXml.Spreadsheet.Sheets Der Container für die Strukturen auf Blockebene, z. B. "sheet, fileVersion" und andere Elemente, die in der Spezifikation ISO/IEC 29500 angegeben sind.
sheet DocumentFormat.OpenXml.Spreadsheet.Sheet Ein Blatt, das auf eine Blattdefinitionsdatei zeigt.
worksheet DocumentFormat.OpenXml.Spreadsheet.Worksheet Eine Blattdefinitionsdatei, welche die Blattdaten enthält.
sheetData DocumentFormat.OpenXml.Spreadsheet.SheetData Die Zellentabelle, die mithilfe von Zeilen gruppiert wird.
row DocumentFormat.OpenXml.Spreadsheet.Row Eine Zeile in der Zellentabelle.
c DocumentFormat.OpenXml.Spreadsheet.Cell Eine Zelle in einer Zeile.
v DocumentFormat.OpenXml.Spreadsheet.CellValue Der Wert einer Zelle.

Beispielcode

Es folgt der vollständige Beispielcode in C# und Visual Basic.

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

static void OpenSpreadsheetDocumentReadonly(string filePath)
{
    // Open a SpreadsheetDocument based on a file path.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }

    // Open a SpreadsheetDocument based on a stream.
    Stream stream = File.Open(filePath, FileMode.Open);

    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }

    // Open System.IO.Packaging.Package.
    Package spreadsheetPackage = Package.Open(filePath, FileMode.Open, FileAccess.Read);

    // Open a SpreadsheetDocument based on a package.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(spreadsheetPackage))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }
}

Siehe auch