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,然后在下一个工作表开始前释放侧信道状态