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