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 programmgesteuert aus einem Stream zu öffnen.
Zeitpunkt des Öffnens aus einem Stream
Wenn Sie über eine Anwendung wie Microsoft SharePoint Foundation 2010 verfügen, die mit Dokumenten mithilfe der Datenstromeingabe/-ausgabe funktioniert, und Sie das Open XML SDK verwenden möchten, um mit einem der Dokumente zu arbeiten, ist dies einfach. Dies gilt insbesondere, wenn das Dokument vorhanden ist und Sie es mit dem Open XML SDK öffnen können. Doch angenommen, das Dokument ist ein geöffneter Stream an der Stelle in Ihrem Code, an dem Sie das SDK zum Arbeiten mit dem Dokument nutzen möchten. Dies ist das Szenario in diesem Thema. Die Beispielmethode im Beispielcode akzeptiert einen offenen Stream als Parameter und fügt dann mithilfe des Open XML SDK Text zum Dokument hinter dem Stream hinzu.
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. |
Generieren des SpreadsheetML-Markups zum Hinzufügen eines Arbeitsblatts
Wenn Sie Zugriff auf den Text des Standard Dokumentteils haben, fügen Sie ein Arbeitsblatt hinzu, indem Sie die -Methode aufrufenAddNewPart, um eine neue WorksheetPartzu erstellen. Im folgenden Codebeispiel wird das neue WorksheetParthinzugefügt.
// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Beispielcode
In diesem Beispiel kann die OpenAndAddToSpreadsheetStream -Methode verwendet werden, um ein Tabellenkalkulationsdokument aus einem bereits geöffneten Datenstrom zu öffnen und daran Text anzufügen. Es folgt der vollständige Beispielcode in C# und Visual Basic.
using (FileStream fileStream = new FileStream(args[0], FileMode.Open, FileAccess.ReadWrite))
{
OpenAndAddToSpreadsheetStream(fileStream);
}
Beachten Sie, dass die OpenAddAndAddToSpreadsheetStream Methode den an sie übergebenen Stream nicht schließt. Der aufrufende Code muss dies manuell oder mit einer using -Anweisung tun.
Es folgt der vollständige Beispielcode in C# und Visual Basic.
static void OpenAndAddToSpreadsheetStream(Stream stream)
{
// Open a SpreadsheetDocument based on a stream.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, true))
{
if (spreadsheetDocument is not null)
{
// Get or create the WorkbookPart
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Workbook workbook = workbookPart.Workbook ?? new Workbook();
if (workbookPart.Workbook is null)
{
workbookPart.Workbook = workbook;
}
Sheets sheets = workbook.GetFirstChild<Sheets>() ?? workbook.AppendChild(new Sheets());
string relationshipId = workbookPart.GetIdOfPart(newWorksheetPart);
// Get a unique ID for the new worksheet.
uint sheetId = 1;
if (sheets.Elements<Sheet>().Count() > 0)
{
sheetId = (sheets.Elements<Sheet>().Select(s => s.SheetId?.Value).Max() + 1) ?? (uint)sheets.Elements<Sheet>().Count() + 1;
}
// Give the new worksheet a name.
string sheetName = "Sheet" + sheetId;
// Append the new worksheet and associate it with the workbook.
Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
sheets.Append(sheet);
}
}
}