XLSB 公式与工作表对象
XLSX 工作簿门面读写一个经过校验的 XLSB 子集,包含类型化值、普通缓存公式、名称、常见样式和已表示的工作表对象;未表示的状态会在目标输出之前被拒绝
打开与保存
if Workbook.Open('values.xlsb') <> 1 then
raise Exception.Create('XLSB input is unsupported or invalid');
if Workbook.SaveAsChecked('values-copy.xlsb', xlsxExcelBinaryWorkbook) <> 1 then
raise Exception.Create('XLSB output is unsupported or failed');
Open 检测工作簿部件的内容与注册类型;二进制输入成功后设置 SourceFormat=xlsxExcelBinaryWorkbook,原有的四个 TXLSXFileFormat 序数保持不变,新成员的序数为 4
文件与流的 SaveAs 及 SaveAsChecked 重载显式接受二进制格式;默认保存仍选择普通 Open XML 工作簿格式,与文件名扩展无关
GetConversionReport(xlsConversionExcelBinaryWorkbook) 检查当前状态而不展开打包单元格存储;不受支持的条目仍是强制失败,即使是不受检保存或 AllowLossy=True
受支持的状态
- 普通工作表、Unicode 名称与字符串、数字、布尔值、空白与带样式的空白单元格,以及普通可表示的错误值
- 共享与内联字符串输入、紧凑的原生数字与短单元格记录、工作表可见性、日期系统标志、普通的工作簿与工作表视图及选区
- 常见字体、图案填充、边缘边框、数字格式、单元格格式引用、对齐与保护标志,以及已表示的 RGB、主题与索引颜色
- 行高、列宽、受支持的维度标志与页边距
- 使用受支持旧式函数标记、标量运算符、A1 引用、同工作簿单表引用和工作簿/工作表名称的普通单元格公式,带数字、字符串、布尔与普通错误缓存
- 全局与工作表级作用域的定义名称、隐藏名称标志与注释、合并单元格、普通外部与内部超链接、拆分或冻结窗格及窗格选区
- AutoFilter 区域、带一个或两个 AND/OR 条件的标量自定义比较,以及带可选空白选择的任意选中值列表
- 带身份、区域、表头与总计行可见性的普通工作表表格,列身份与标题、字面总计行标签、已表示的 AutoFilter 条件和内置表格样式标志
- 通过既有工作簿选项配置 ZIP 压缩与确定性 ZIP 时间戳
转换报告覆盖活动模型特性,完整包校验仍是无效引用、畸形记录、陌生属性或不受支持保留内容的最后一道关卡
二进制导入保留文件的显式默认字体与受支持的内置数字格式,包括带样式的空白单元格;依赖区域的数字格式需要显式的格式代码,读取器不会猜测区域格式
显式边界
共享公式记录、数组与动态数组归属、数组常量与返回数组的函数、未来函数、用户自定义函数、外部工作簿与多表引用、VBA、外部数据连接、数据透视表与 Slicer、图表与绘图、批注与富文本、校验、条件格式以及高级页面或扩展元数据都在此后端之外
表格计算列、总计聚合公式、排序状态、差分或自定义表格格式、绑定查询的表格与 XML 映射会被拒绝;颜色、图标、动态与日期分组筛选、类型化原生布尔自定义条件、看起来像数字的原生字符串自定义条件以及筛选按钮可见性覆盖同样被拒绝
导入的非自定义工作表筛选条件保留为 RawXml;自定义比较填充既有的类型化条件属性,而选中值与空白选择仍是基于 XML 的条件,而不是新的类型化值列表 API
公式标记转换保留语义与引用标志;它可能用括号和带引号的表名规范化公式文本,因此不承诺逐字节文本一致
公式输出要求显式的数字、字符串、布尔或普通错误缓存;保存策略不重算时缺失缓存会被拒绝,包括 xrmManual 以及依赖图干净时的 xrmIfDirty;应用可以在保存前调用 Recalculate 或选择 xrmAlways,空字符串、False 与数字零都是有效缓存
计算属性必须使用受支持的默认值;手动计算、迭代、降低精度、替代引用模式、强制或不完整计算、显式线程配置以及其他有意义的非默认设置会被拒绝
计算链与二进制单元格索引是重新生成的元数据,不会跨包桥复制;陌生的特性记录或关系仍是失败,不会变成编造的 Open XML 部件
二进制输入要求急切的整表加载;MetadataOnly 与非空的 SelectedSheets 列表会在替换既有模型之前被拒绝,因为延迟加载需要保留转换后的归档
失败与所有权保证
二进制包在常规 XML 解析器重置工作簿之前完成校验与转换;不受支持的输入、畸形的二进制内容、被拒绝的读取模式以及转换取消都会保留既有工作表对象、文件名、源格式与源归档绑定
经过校验的二进制转换进入既有 XML 解析器之后,晚期的 XML 解析或应用回调失败遵循常规的 XML 打开生命周期;预检保证不承诺回滚任意的回调写入
保存会暂存整个二进制包;文件输出使用同目录临时文件和一次最终替换,可读可寻位的流输出保留字节、大小与位置快照,提交失败后可回滚
LastSaveUsedStreaming=False 反映完整的二进制暂存,即使中间的 XML 写入器在流式工作;内存包含转换的部件与完整包,所以此后端不是有界内存的流式写入器
转换报告与预检保留打包单元格存储,包括打包值与已物化公式混合的情况;成功保存可能经既有的样式准备与工作表写入器展开打包值,因此报告的纯净不代表保存操作不可变或不物化
成功的二进制文件保存会清除先前的原始 XML 源绑定;流保存保留文件名行为,取消检查发生在目标提交之前
包转换 API
procedure XlsbToOpenXml(Source: TZipArchive; Destination: TStream; CancelCheck: TXLSStreamCancelCheck = nil; EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0); procedure OpenXmlToXlsb(Source: TZipArchive; Destination: TStream; CancelCheck: TXLSStreamCancelCheck = nil; EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0); function XlsbStylesToXml(const Data: AnsiString): AnsiString; function XlsbStylesFromXml(const Data: AnsiString): AnsiString; function XlsbStringsToXml(const Data: AnsiString): AnsiString; function XlsbStringsFromXml(const Data: AnsiString): AnsiString;
TXlsbFormulaValidator.Create(WorkbookXml) 校验工作簿名称上下文,Validate(FormulaText, SheetIndex) 在不访问工作表单元格的情况下校验公式;SheetIndex 从零开始,校验器由调用方持有
XlsbValidateTableXml(Data) 与 XlsbValidateAutoFilterXml(Data) 按 包输出所用的同一套编码器契约校验 UTF-8 对象 XML;失败抛出既有的格式或不受支持特性异常
这些 lxXlsb API 保留调用方所有权;包转换在从偏移零替换 Destination 之前校验并暂存所有部件,核心部件桥使用 UTF-8 XML 与原始二进制字节
EXlsbUnsupported 派生自 EXlsbFormatError,区分预期的子集拒绝与畸形数据;取消会在提交前抛出既定的流取消异常
压缩级别接受 -1 到 9,固定日期接受零或 1980 到 2107 之间可用 DOS 表示的有限日期;无效选项在目标改变之前被拒绝