HotXLS Docs

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

FieldMeaning
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');

另请参阅