Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
Das SpreadsheetDocument-Objekt
Die grundlegende Dokumentstruktur eines SpreadsheetML-Dokuments besteht aus den Sheets Elementen und Sheet , die auf die Arbeitsblätter im Workbookverweisen. Für jede Worksheetwird eine separate XML-Datei erstellt. For example, the SpreadsheetML for a workbook that has two worksheets name MySheet1 and MySheet2 is located in the Workbook.xml file and is as follows.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://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 XML-Dateien des Arbeitsblatts enthalten ein oder mehrere Elemente auf Blockebene, z SheetData. B. .
sheetData stellt die Zelltabelle dar und enthält ein oder Row mehrere Elemente. Ein row -Element enthält mindestens ein Cell -Element. Jede Zelle enthält ein CellValue Element, das den Wert der Zelle darstellt. Beispiel: Der SpreadsheetML-Code des ersten Arbeitsblatts in einer Arbeitsmappe, das nur den Wert 100 in Zelle A1 enthält, ist in der Datei "Sheet1.xml" enthalten 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. Sie finden diese Klassen im DocumentFormat.OpenXML.Spreadsheet -Namespace. In der folgenden Tabelle sind die Klassennamen der Klassen aufgeführt, die den workbookElementen , sheets, sheet, worksheetund sheetData entsprechen.
| SpreadsheetML-Element | Open XML SDK-Klasse | Beschreibung | |
|---|---|---|---|
<workbook/> |
Workbook | Das Stammelement des Hauptdokumentteils. | |
<sheets/> |
Sheets | Der Container für die Strukturen auf Blockebene, z. B. sheet, fileVersion und | andere, die in der ISO/IEC 29500-Spezifikation angegeben sind. |
<sheet/> |
Sheet | Ein Blatt, das auf eine Blattdefinitionsdatei zeigt. | |
<worksheet/> |
Worksheet | Eine Blattdefinitionsdatei, welche die Blattdaten enthält. | |
<sheetData/> |
SheetData | Die Zellentabelle, die mithilfe von Zeilen gruppiert wird. | |
<row/> |
Row | Eine Zeile in der Zellentabelle. | |
<c/> |
Cell | Eine Zelle in einer Zeile. | |
<v/> |
CellValue | Der Wert einer Zelle. |
Abrufen eines SpreadsheetDocument-Objekts
Im Open XML SDK stellt die SpreadsheetDocument -Klasse ein Excel-Dokumentpaket dar. Um ein Excel-Dokument zu erstellen, erstellen Sie eine instance der SpreadsheetDocument -Klasse und füllen sie mit Teilen auf. 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.
Um die Klasse instance aus dem Dokument zu erstellen, das Sie eine der Open Überladungsmethoden aufrufen. 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:
| Ö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 Tabelle weiter oben in diesem Thema sind nur die Open Methoden aufgeführt, die einen booleschen Wert als zweiten Parameter akzeptieren, um anzugeben, ob ein Dokument bearbeitet werden kann. Um ein Dokument für schreibgeschützten Zugriff zu öffnen, geben Sie für diesen Parameter an False .
Beachten Sie, dass zwei der Open Methoden eine instance der SpreadsheetDocument-Klasse erstellen, die auf einer Zeichenfolge als ersten Parameter basiert. Das erste Beispiel im Beispielcode veranschaulicht diese Technik. Sie verwendet die erste Open Methode in der Tabelle weiter oben 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. Dieses Beispiel verwendet false und gibt an, 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 anderen beiden Open Methoden erstellen eine instance der SpreadsheetDocument-Klasse basierend auf einem Eingabe-/Ausgabestream. 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 einen 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 Methode besteht darin, das Paket zunächst schreibgeschützt zu öffnen, bevor die instance der SpreadsheetDocument Klasse erstellt wird, wie im zweiten Beispiel im Beispielcode gezeigt. 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))
Beispielcode
Es folgt der vollständige Beispielcode in C# und Visual Basic.
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.
}
}
}