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. Das SDK-DOM ist so konzipiert, dass das Abfragen und Analysieren von Open XML-Dateien durch Verwendung stark typisierter Klassen vereinfacht wird. Für den DOM-Ansatz müssen jedoch gesamte Open XML-Teile in den Speicher geladen werden, was zu der Ausnahme Nicht genügend Arbeitsspeicher führen kann, wenn Sie mit sehr großen Dateien arbeiten. Unter Verwendung des SAX-Ansatzes können Sie einen OpenXMLReader verwenden, um die XML in der Datei Element für Element zu lesen, ohne die gesamte Datei in den Speicher laden zu müssen. 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.

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

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