Freigeben über


Öffnen eines Kalkulationstabellendokument aus einem Stream

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 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 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 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 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
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.

Generieren des SpreadsheetML-Markups zum Hinzufügen eines Arbeitsblatts

Wenn Sie Zugriff auf den Textkörper des Hauptdokumentteils haben, können Sie ein Arbeitsblatt hinzufügen, indem Sie die AddNewPart<T>(String, String)-Methode zum Erstellen eines neuen WorksheetPart-Elements aufrufen. Im folgenden Codebeispiel wird versucht, das neue WorksheetPart-Element hinzuzufügen.


// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
newWorksheetPart.Worksheet.Save();


Beispielcode

In this example, the OpenAndAddToSpreadsheetStream method can be used to open a spreadsheet document from an already open stream and append some text to it. Es folgt der vollständige Beispielcode in C# und Visual Basic.

var fileStream = File.Open(args[0], FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
OpenAndAddToSpreadsheetStream(fileStream);

Beachten Sie, dass die OpenAddAndAddToSpreadsheetStream-Methode den Stream nicht schließt, der an sie übergeben wird. Dies muss der aufrufende Code übernehmen.

Es folgt der vollständige Beispielcode in sowohl C# als auch Visual Basic.

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

static void OpenAndAddToSpreadsheetStream(Stream stream)
{
    // Open a SpreadsheetDocument based on a stream.
    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());
        newWorksheetPart.Worksheet.Save();
        

        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);
        workbookPart.Workbook.Save();

        // Dispose the document handle.
        spreadsheetDocument.Dispose();
    }
}

Siehe auch