C# Lectura de ficheros Excel .xlsx de gran tamaño con Openxml

Israel A. Cortes Flores
4 min readDec 29, 2016

--

En un artículo anterior hablamos sobre los diferentes métodos de lectura de un fichero de Excel con C#

Ahora nos centraremos en OpenXML-SDK→ Es un SDK open-source que provee librerías para trabajar con documentos Office Open XML (DOCX, XLSX, and PPTX) sin necesitada de tener Office instalado.

OpenXML-SDK

Permite cosas como:

  • Generación de documentos de proceso de texto de alto rendimiento, hojas de cálculo y presentaciones.
  • Crear contenidos en ficheros DOCX desde ficheros XML como origen de datos.
  • Dividir o separar documentos DOCX o PPTX en múltiples ficheros o combinar multiples ficheros DOCX / PPTX en uno.
  • Conversiones de alta calidad de DOCX => HTML/CSS y HTML/CSS => DOCX.
  • Extraer datos XLSX.
  • Buscar y reemplazar contenido en DOCX / PPTX usando expresiones regulares.
  • Actualizar la información cacheada de gráficos embebidos en hojas de cálculo de DOCX / PPTX.
  • Modificar documentos.

Open XML SDK ofrece dos formas de analizar archivos Office Open XML. Se pueden usar las características de lectura y escritura del SDK Document Object Model (DOM) o las de Simple API para XML (SAX).

El sdk compatible con Office2016 se encuentra en

https://github.com/OfficeDev/Open-XML-SDK/tree/feature/office2016

Simple API for XML (SAX) Lectura grandes ficheros

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.

Lo importante es poder obtener el formato en el que están guardados los datos, el siguiente ejemplo lee la información de una celda transformado a su formato correcto, cadena, número o fecha.

Cadenas tienen el DataType de la celda igual a CellValues.SharedString (las cadenas suelen estar en una tabla por lo que no es directo su acceso)

Booleanos tienen el DataType de la celda igual a CellValues.Boolean (Vienen como cadena 0 y 1)

Números y Fechas tienen el DataType a null, el formato fecha viene como el número de días transcurrido desde el 1 de Enero de 1900 por lo que habrá que convertirlo desde OADate a Datetime.

La única forma de diferenciar Números de fechas es por la propiedad StyleIndex que para números es 2 y para Fechas 3.

El siguiente ejemplo se ha utilizado para leer ficheros de 100 a 27.000 registros con un alto rendimiento y bajo consumo de RAM.

SDK Document Object Model (DOM) Leer y editar

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, también requiere que se carguen partes completas de Office Open XML a la memoria, lo que puede provocar una excepción de memoria insuficiente al trabajar con archivos realmente grandes.

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

En el siguiente enlace se describe como escribir una hoja de cálculo XLSX sin necesidad de tener Office instalado.

--

--