Share via


Análisis y lectura de un documento de hoja de cálculo grande

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para leer mediante programación un archivo grande de Excel. Para obtener más información sobre la estructura básica de un documento SpreadsheetML , vea Estructura de un documento SpreadsheetML.

Nota:

¿Le interesa el desarrollo de soluciones que amplían la experiencia de Office en varias plataformas? Vea el nuevo modelo de complementos de Office. Los complementos de Office tienen una huella pequeña en comparación con los complementos y soluciones de VSTO, y se pueden construir utilizando casi cualquier tecnología de programación web, como HTML5, JavaScript, CSS3 y XML.


Enfoques para analizar los archivos Open XML

El SDK de Open XML proporciona dos enfoques para analizar los archivos Open XML. Se pueden usar las características de lectura y escritura del SDK Document Object Model (DOM) o las de Simple API for XML (SAX). El SDK DOM está diseñado para facilitar la consulta y el análisis de archivos Office Open XML mediante clases fuertemente tipadas. Sin embargo, el enfoque de DOM requiere cargar partes completas de Open XML en la memoria, lo que puede provocar una excepción Sin memoria cuando se trabaja con archivos realmente grandes. Si se emplea SAX, se puede usar un OpenXMLReader para leer el XML en el archivo, elemento a elemento, sin tener que cargar todo el archivo a la memoria. Considere el uso de SAX cuando tenga que manejar archivos muy grandes.

El siguiente segmento de código se usa para leer un archivo de Excel de gran tamaño mediante DOM.


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 + " ");
    }
}

El siguiente segmento de código realiza una tarea idéntica a la del ejemplo anterior (leer un archivo de Excel de gran tamaño), pero usa SAX. Este es el procedimiento recomendado para leer archivos muy grandes.


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 + " ");
    }
}


Código de ejemplo

Imagine un escenario en el que trabaja para una compañía financiera que usa hojas de cálculo de Excel de gran tamaño. Los analistas actualizan diariamente esas hojas de cálculo, las cuales pueden llegar a tener tamaños que superan los 100 megabytes. Se necesita una solución para leer y extraer datos relevantes de cada hoja de cálculo. El siguiente ejemplo de código contiene dos métodos que corresponden a los dos enfoques, DOM y SAX. La última técnica evitará excepciones de memoria al usar archivos muy grandes. Para probarlos, puede llamarlos en el código uno tras otro, o puede llamar cada método por separado comentando la llamada a aquel que le gustaría excluir.

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

El siguiente es el ejemplo de código completo en C# y Visual Basic.

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();
    }
}

Consulte también

Estructura de un documento SpreadsheetML