HotXLS 文档

已加载工作簿的结构世代

结构世代让读取者能够保留开销低廉的快照,并在其所依赖的工作簿拓扑发生变化之后拒绝遍历

世代来源

引擎单元格存储世代工作表集合世代
经典 XLSTXLSWorksheet.CellStructureGenerationTXLSWorksheets.StructureGeneration
XLSXTXLSXWorksheet.CellStructureGeneration 或 TXLSXCells.StructureGenerationTXLSXSheets.StructureGeneration

每个属性都是只读的 UInt64 值,其变化的具体幅度不属于契约范围

导致失效的操作

创建、移除或清除已存储单元格会在拓扑真正变化时改变单元格存储世代

行或列的插入与删除、坐标移动、打包追加或具体化,以及显式的单元格索引重建,也会使单元格存储遍历状态失效

添加、删除、移动或清除工作表会在集合真正变化时改变工作表集合世代

不会导致失效的操作

更改现有单元格的值、公式、缓存值或格式不会改变其单元格存储世代

重命名或激活工作表不会改变工作表集合世代;没有实际效果的移动、删除不存在的对象或清除已经为空的集合都会保持当前世代

验证

在推进或读取为较早世代创建的遍历状态之前,请调用 XlsValidateStructureGeneration

不匹配会引发 EXLSLoadedCellCursorInvalidated,让调用方能够把结构失效与数据或格式错误区分开

ExpectedGeneration := Worksheet.CellStructureGeneration;

{ Read or retain traversal state }

XlsValidateStructureGeneration(
  ExpectedGeneration,
  Worksheet.CellStructureGeneration);

经典工作簿游标

IXLSWorkbook.CreateLoadedCellCursor 会捕获经典工作簿的聚合世代,并在每次 MoveNext 和 Current 调用之前对它进行验证

游标以恒定的游标状态直接遍历已分配的稀疏存储分支,并返回自有的 TXLSLoadedCellSnapshot 值

布尔重载固定了是否包含具有独立样式的已存储空白单元格;继承的行、列和工作表格式不会创建空白的游标条目

XLSX 工作簿游标

TXLSXWorkbook.CreateLoadedCellCursor 会捕获一个工作簿生命周期租约和一个聚合拓扑世代,二者由每个工作表的单元格存储和工作表集合共享

已具体化的路径直接读取稀疏行块,而打包路径重用打包迭代器,不具体化单元格,也不在快照中保留内部指针

布尔重载可以在两种存储表示中包含只有样式的已存储空白单元格,而无样式的 Empty 和 Null 占位符仍被排除在外

释放工作簿会在工作表存储被释放之前使其租约失效,因此之后的游标访问会引发 EXLSLoadedCellCursorInvalidated

并发边界

世代检查只提供快速失败检测,并不能使并发的工作簿变更和遍历变成线程安全的

另请参阅