Documentación HotXLS

Streaming de hojas de cálculo grandes

Información general

Cargar hojas de cálculo muy grandes (p. ej. millones de celdas rellenas) en memoria puede provocar errores de memoria insuficiente en procesos de 32 bits; HotXLS proporciona lectores y escritores de streaming con un uso de memoria casi constante, evitando la generación de DOM durante el análisis del libro

API del lector directo

La clase TXLSDirectReader analiza los flujos del libro sin crear modelos de celdas en memoria y dispara los eventos OnSheet y OnCell a medida que encuentra las celdas seleccionadas

Reader := TXLSDirectReader.Create;
try
  Reader.ParallelSheets := True;
  Reader.ParallelMaxThreads := 4;
  Reader.ParallelBufferMemoryLimit := 16 * 1024 * 1024;
  Reader.OnDimension := HandleDimension;
  Reader.OnColumn := HandleColumn;
  Reader.OnRow := HandleRow;
  Reader.OnMerge := HandleMerge;
  Reader.OnCell := HandleCell;
  Reader.ReadFile('large.xlsx');
finally
  Reader.Free;
end;

ParallelSheets habilita infladores de hojas de cálculo y lectores XML locales de cada worker mientras el hilo llamador emite las devoluciones de llamada en orden de hoja de cálculo y celda

ParallelBufferMemoryLimit acota la carga agregada de celdas en bruto encolada entre los workers activos y su valor predeterminado es 16 MiB, mientras que ParallelPeakBufferedBytes informa del pico de la última lectura paralela para diagnósticos y pruebas de capacidad

Cada hoja de cálculo activa recibe una cuota independiente del presupuesto de la cola, lo que evita que una hoja posterior prive de recursos a la que se está emitiendo; una única celda mayor que su cuota se admite como carga irreducible

OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane y OnMerge exponen el rango usado, los anchos y altos predeterminados, los tramos de columna, la altura o visibilidad de fila, los índices de esquema y estilo, el estado de paneles y los rangos combinados sin construir objetos de hoja de cálculo

Las devoluciones de llamada de disposición son opcionales y se ejecutan en una pasada de metadatos de memoria acotada antes de las devoluciones de llamada OnCell de la hoja seleccionada; los rangos combinados llegan por tanto antes que las celdas dentro de la combinación, aunque OOXML almacena mergeCells después de sheetData

Cuando el análisis paralelo de hojas está habilitado, las devoluciones de llamada de disposición permanecen en el hilo llamador y se completan para las hojas seleccionadas antes de vaciar las colas de los workers

Establecer Abort en OnCell despierta a productores y consumidores bloqueados, detiene las lecturas ZIP en curso y la descompresión en pasos internos acotados, espera a todos los workers y deja el lector en estado reutilizable

API del escritor directo

La clase TXLSDirectWriter escribe las filas directamente en el paquete del fichero ZIP, asegurando una sobrecarga mínima de memoria al generar grandes exportaciones de datos

Writer := TXLSDirectWriter.Create;
try
  Writer.BeginFile('large.xlsx');
  Writer.AddSheet('Data');
  Writer.AddRow(1);
  Writer.WriteString(1, 'Quarter');
  Writer.WriteString(2, 'Revenue');
  Writer.AddComment(2, 1, 'Validated source', 'Reviewer');
  Writer.AddImageFromFile(4, 1, 8, 12, 'logo.png',
    xlsDirectImagePng, 'Company logo');
  ChartIndex := Writer.AddChart(9, 1, 18, 16,
    xlsDirectChartColumn, 'Revenue');
  Writer.AddChartSeries(ChartIndex, 'Revenue',
    'Data!$A$2:$A$5', 'Data!$B$2:$B$5');
  Writer.Close;
finally
  Writer.Free;
end;

AddComment escribe notas de celda clásicas con metadatos de autor y las formas de nota VML correspondientes sin cargar un modelo de objetos de hoja de cálculo

AddImage, AddImageFromFile y AddImageFromStream aceptan anclajes de dos celdas y cargas PNG, JPEG, GIF, BMP, EMF o WMF; los orígenes de archivo fluyen directamente a la entrada ZIP cuando la hoja termina, mientras que los orígenes de flujo retienen solo la referencia al flujo y el rango de bytes registrado

Cuando AddImageFromStream recibe OwnsStream=True, el escritor libera ese flujo después de finalizar las partes laterales de la hoja de cálculo; de lo contrario, el llamador debe mantener vivo el flujo posicionable hasta la siguiente llamada a AddSheet o Close

AddChart y AddChartSeries generan ChartML de columnas, barras, líneas, áreas, circular, anillo o dispersión con series respaldadas por fórmulas, mientras que AddChartXml adjunta una parte de gráfico completa suministrada por el llamador para familias de gráficos avanzadas y extensiones

Los comentarios, los anclajes de dibujo y los descriptores de gráfico se retienen solo para la hoja de cálculo actual; después de que sheetData se cierra, el escritor emite relaciones de hoja, comentarios, VML, DrawingML, medios y ChartML de forma secuencial y luego libera el estado del canal lateral antes de que empiece la siguiente hoja de cálculo