Abrufen von Arbeitsblattinformationen aus einem Open XML-Paket
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um Informationen programmgesteuert aus einem Arbeitsblatt in einem Tabellenkalkulationsdokument abzurufen.
Grundlegende Struktur eines SpreadsheetML-Dokuments
Die grundlegende Struktur eines SpreadsheetML-Dokuments besteht aus den Sheets and 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 nachstehenden Codebeispiel angezeigt.
<?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 XML-Dateien des Arbeitsblatts enthalten ein oder mehrere Elemente auf Blockebene, z. B. sheetData stellt die Zelltabelle dar und enthält ein 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 wird im nachstehenden Codebeispiel angezeigt.
<?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 |
---|---|---|
workbook | DocumentFormat.OpenXML.Spreadsheet.Workbook | Das Stammelement des Hauptdokumentteils. |
sheets | DocumentFormat.OpenXML.Spreadsheet.Sheets | Der Container für die Strukturen auf Blockebene, wie 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. |
Funktionsweise des Beispielcodes
Nach Öffnen der Datei für den schreibgeschützten Zugriff instanziieren Sie die Sheets -Klasse.
Sheets? sheets = mySpreadsheet.WorkbookPart?.Workbook?.Sheets;
Anschließend durchlaufen Sie die Sheets-Auflistung und zeigen OpenXmlElement und das OpenXmlAttribute-Element in jedem Element an.
foreach (OpenXmlElement sheet in sheets)
{
foreach (OpenXmlAttribute attr in sheet.GetAttributes())
{
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
}
}
Durch Anzeigen der Attributinformationen rufen Sie den Namen und die ID jedes Arbeitsblatts in der Tabellenkalkulationsdatei ab.
Beispielcode
Nachstehend ist der vollständige Beispielcode in C# und Visual Basic aufgeführt.
using DocumentFormat.OpenXml.Packaging;
using System;
using OpenXmlAttribute = DocumentFormat.OpenXml.OpenXmlAttribute;
using OpenXmlElement = DocumentFormat.OpenXml.OpenXmlElement;
using Sheets = DocumentFormat.OpenXml.Spreadsheet.Sheets;
static void GetSheetInfo(string fileName)
{
// Open file as read-only.
using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(fileName, false))
{
Sheets? sheets = mySpreadsheet.WorkbookPart?.Workbook?.Sheets;
if (sheets is not null)
{
// For each sheet, display the sheet information.
foreach (OpenXmlElement sheet in sheets)
{
foreach (OpenXmlAttribute attr in sheet.GetAttributes())
{
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
}
}
}
}
}