已加载工作簿的结构世代
结构世代让读取者能够保留开销低廉的快照,并在其所依赖的工作簿拓扑发生变化之后拒绝遍历
世代来源
| 引擎 | 单元格存储世代 | 工作表集合世代 |
|---|---|---|
| 经典 XLS | TXLSWorksheet.CellStructureGeneration | TXLSWorksheets.StructureGeneration |
| XLSX | TXLSXWorksheet.CellStructureGeneration 或 TXLSXCells.StructureGeneration | TXLSXSheets.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
并发边界
世代检查只提供快速失败检测,并不能使并发的工作簿变更和遍历变成线程安全的