TryGetCachedFormulaValue 方法
读取已存储的公式结果,而不对公式求值或更改工作簿状态
该方法在 IXLSWorkbook 和 TXLSXWorkbook 上均可用;包工作簿实现涵盖 XLSX 和 ODS 文件
与引擎无关的代码可以通过 CreateFormulaCacheReader 从任一引擎获取 IXLSFormulaCacheReader,并使用相同的查询方法
语法
function TryGetCachedFormulaValue( SheetIndex, Row, Col: Integer; out AInfo: TXLSFormulaCacheInfo): Boolean;
坐标与返回值
SheetIndex, Row, and Col are one-based
只有当公式单元格的缓存状态为 xlfcsLoaded 或 xlfcsCalculated 时,该方法才返回 True
无效坐标、不存在的单元格和非公式单元格返回 False 并带有 xlfcsNotFormula
没有存储结果的公式返回 False 并带有 xlfcsMissing;曾缓存过但在修改之后公式或计算失败的公式返回 False 并带有 xlfcsInvalidated
缓存信息
TXLSFormulaCacheInfo 记录通过 lxStandard 中声明的两个枚举来分类缓存:State 是 TXLSFormulaCacheState,Kind 是 TXLSFormulaCacheValueKind
| Field | Meaning |
|---|---|
State (TXLSFormulaCacheState) | xlfcsNotFormula, xlfcsMissing, xlfcsLoaded, xlfcsCalculated, or xlfcsInvalidated |
Kind (TXLSFormulaCacheValueKind) | xlfcvBlank, xlfcvNumber, xlfcvDateTime, xlfcvString, xlfcvBoolean, or xlfcvError |
Value | 方法返回 True 时的自有缓存 Variant,否则为 Unassigned |
空白结果、空字符串、布尔 false、数值零和错误保留各自不同的种类,不会被用作缓存存在性的替代标志
BIFF 数值缓存保持为 Double,因为记录没有日期类型标记;错误缓存作为 varError 返回
对于包工作簿,OOXML t="d" 和 ODF 日期值返回 varDate,OOXML t="e" 返回 varError,ODF 缓存的空白以 void 值类型保留
更改公式会使其原有缓存失效,而先赋一个缓存值再赋公式则会记录一个已计算的缓存
每个共享公式成员都保留自己的缓存存在性和值;没有存储结果的从属成员报告 xlfcsMissing,而不是继承根成员的缓存
不计算约定
该方法执行直接的稀疏单元格查找,绝不会调用计算器、用户函数回调、公式标记反编译、依赖项更新、缓存写入或脏状态更改
需要计算时,请使用普通的单元格 Value 属性
读取器生命周期
CreateFormulaCacheReader 返回一个由工作簿生命周期租约支撑的只读适配器,不转移工作簿所有权
工作簿销毁之后,通过该适配器进行的任何查询都会引发 EXLSFormulaCacheReaderInvalidated,而不是解引用已释放的工作簿状态
示例
Reader := Workbook.CreateFormulaCacheReader;
if Reader.TryGetCachedFormulaValue(1, 4, 2, Info) then
Memo1.Lines.Add(VarToStr(Info.Value))
else if Info.State = xlfcsMissing then
Memo1.Lines.Add('Formula has no stored result');