HotXLS Docs

Large Spreadsheet Streaming

Overview

将超大型电子表格(例如数百万个已填充单元格)加载到内存中,可能导致 32 位进程出现内存不足错误;HotXLS 提供内存占用近乎恒定的流式读取器和写入器,在工作簿解析期间绕过 DOM 生成

Direct Reader API

TXLSDirectReader 类在不创建内存单元格模型的情况下解析工作簿流,并在遇到所选单元格时触发 OnSheet 和 OnCell 事件

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 enables worker-local worksheet inflaters and XML readers while the calling thread emits callbacks in worksheet and cell order

ParallelBufferMemoryLimit 限制活动工作线程之间排队原始单元格负载的总量,默认 16 MiB;ParallelPeakBufferedBytes 报告上一次并行读取的峰值,用于诊断和容量测试

每个活动工作表都会分到独立的队列预算份额,防止后面的工作表饿死当前正在输出的工作表;超过自身份额的单个大单元格会作为不可再分的负载放行

OnDimension、OnSheetFormat、OnColumn、OnRow、OnPane 和 OnMerge 无需构建工作表对象即可暴露已用区域、默认宽高、列跨度、行高或可见性、大纲和样式索引、窗格状态以及合并区域

布局回调是可选的,会在所选工作表的 OnCell 回调之前、以有界内存的元数据阶段运行;因此合并区域先于合并内的单元格到达,即使 OOXML 把 mergeCells 存在 sheetData 之后

启用并行工作表解析时,布局回调仍留在调用线程上,并在工作线程队列被消费之前对所选工作表完成

在 OnCell 中设置 Abort 会唤醒阻塞的生产者和消费者,在有界内部步骤处停止进行中的 ZIP 读取和解压, join 所有工作线程,并保持读取器可复用

Direct Writer API

TXLSDirectWriter 类把行直接写入 ZIP 文件包,在生成大型数据导出时确保最小的内存开销

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 writes classic cell notes with author metadata and the matching VML note shapes without loading a worksheet object model

AddImage、AddImageFromFile 和 AddImageFromStream 接受双单元格锚点以及 PNG、JPEG、GIF、BMP、EMF 或 WMF 负载;文件来源在工作表结束时直接流入 ZIP 条目,而流来源只保留流引用和记录的字节区间

当 AddImageFromStream 收到 OwnsStream=True 时,写入器会在工作表侧部件定稿后释放该流;否则调用方必须让可定位的流保持存活,直到下一次 AddSheet 或 Close 调用

AddChart 和 AddChartSeries 生成柱形图、条形图、折线图、面积图、饼图、圆环图或散点图的 ChartML,序列可由公式支撑;AddChartXml 则附加完整的调用方提供的图表部件,用于高级图表族和扩展

批注、绘图锚点和图表描述符只为当前工作表保留;sheetData 关闭后,写入器按顺序发出工作表关系、批注、VML、DrawingML、媒体和 ChartML,然后在下一个工作表开始前释放侧信道状态