Freigeben über


Analysieren und Lesen eines großen Tabellenkalkulationsdokuments

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um eine große Excel-Datei programmgesteuert zu lesen. Weitere Informationen zur grundlegenden Struktur eines SpreadsheetML Dokuments finden Sie unter Struktur eines SpreadsheetML-Dokuments.

Hinweis

Haben Sie Interesse an der Entwicklung von Lösungen, mit denen die Funktionen von Office über mehrere Plattformen erweitert werden können? Schauen Sie sich das neue Office-Add-In-Modell an. Office-Add-Ins haben im Vergleich zu VSTO-Add-Ins und -Lösungen einen geringen Platzbedarf. Sie können sie mit fast jeder Web-Programmiertechnologie erstellen, z. B. HTML5, JavaScript, CSS3 und XML.


Ansätze zum Analysieren von Open XML-Dateien

Das Open XML SDK bietet zwei Vorgehensweisen zum Analysieren von Open XML-Dateien. You can use the SDK Document Object Model (DOM), or the Simple API for XML (SAX) reading and writing features. The SDK DOM is designed to make it easy to query and parse Open XML files by using strongly-typed classes. Der DOM-Ansatz erfordert jedoch das Laden ganzer Open XML-Teile in den Arbeitsspeicher, was eine Out of Memory Ausnahme verursachen kann, wenn Sie mit wirklich großen Dateien arbeiten. Using the SAX approach, you can employ an OpenXMLReader to read the XML in the file one element at a time, without having to load the entire file into memory. Consider using SAX when you need to handle very large files.

Mit dem folgenden Codesegment wird eine sehr umfangreiche Excel-Datei mithilfe des DOM-Ansatzes gelesen.

WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
string? text;

foreach (Row r in sheetData.Elements<Row>())
{
    foreach (Cell c in r.Elements<Cell>())
    {
        text = c?.CellValue?.Text;
        Console.Write(text + " ");
    }
}

Das folgende Codesegment führt eine identische Aufgabe mit dem vorherigen Beispiel aus (liest eine sehr große Excel-Datei), verwendet jedoch den SAX-Ansatz. Dies ist der empfohlene Ansatz zum Lesen sehr großer Dateien.

WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
string text;
while (reader.Read())
{
    if (reader.ElementType == typeof(CellValue))
    {
        text = reader.GetText();
        Console.Write(text + " ");
    }
}


Beispielcode

Stellen Sie sich ein Szenario vor, in dem Sie für ein Finanzunternehmen arbeiten, von dem sehr umfangreiche Excel-Tabellenkalkulationen verwendet werden. Diese Tabellenkalkulationen werden täglich von Analysten aktualisiert und können leicht eine Größe von mehreren Hundert MB erreichen. Sie benötigen eine Lösung zum Lesen und Extrahieren von relevanten Daten aus jeder Tabellenkalkulation. Das folgende Codebeispiel enthält zwei Methoden, die den beiden Ansätzen DOM und SAX entsprechen. Bei der zuletzt genannten Technik werden Ausnahmen bezüglich des Arbeitsspeichers bei Verwendung von sehr umfangreichen Dateien vermieden. Zum Testen dieser Methoden können Sie diese im Code nacheinander aufrufen, oder Sie können jede Methode separat aufrufen, indem Sie den Aufruf der auszuschließenden Methode auskommentieren.

// Comment one of the following lines to test the method separately.
ReadExcelFileDOM(args[0]);    // DOM
ReadExcelFileSAX(args[0]);    // SAX

Nachstehend ist der vollständige Beispielcode in C# und Visual Basic aufgeführt.

// The DOM approach.
// Note that the code below works only for cells that contain numeric values
static void ReadExcelFileDOM(string fileName)
{
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
    {
        WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
        WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
        SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
        string? text;

        foreach (Row r in sheetData.Elements<Row>())
        {
            foreach (Cell c in r.Elements<Cell>())
            {
                text = c?.CellValue?.Text;
                Console.Write(text + " ");
            }
        }

        Console.WriteLine();
        Console.ReadKey();
    }
}

// The SAX approach.
static void ReadExcelFileSAX(string fileName)
{
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
    {
        WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
        WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

        OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
        string text;
        while (reader.Read())
        {
            if (reader.ElementType == typeof(CellValue))
            {
                text = reader.GetText();
                Console.Write(text + " ");
            }
        }


        Console.WriteLine();
        Console.ReadKey();
    }
}

Siehe auch

Struktur eines SpreadsheetML-Dokuments