数据透视表的安全工作表物化
版本 2.384.90 新增隔离的数据透视表求值与受保护的工作表结果替换;版本 2.384.92 把受支持的本地源扩展到每次调用时解析的定义名称与表格
物化一个视图
if Workbook.RefreshPivotCache(Pivot.CacheId) <> 1 then
raise Exception.Create('Pivot cache refresh failed');
if Workbook.MaterializePivotTable(Pivot) <> 1 then
raise Exception.Create('Pivot output cannot be replaced safely');
TXLSXWorkbook.MaterializePivotTable(ATable: TXLSPivotTable): Integer 从当前缓存计算结果并放到视图的 FirstRow 与 FirstCol;成功返回 1,源不受支持、目标不安全、求值失败或工作簿变更被拒绝时返回 -1
刷新与工作表重算仍是显式操作;成功的物化会使计算依赖失效,调用方可以在合适的时机重算下游公式
默认重载接受空白目标单元格以及先前由同一视图持有的未变更单元格;完整输出矩形内任何被他人占用的单元格都会拒绝该操作,包括结果写入器不会填充的空隙
if Workbook.MaterializePivotTable(Pivot, True) <> 1 then
raise Exception.Create('Existing Pivot values cannot be adopted safely');
TXLSXWorkbook.MaterializePivotTable(ATable: TXLSPivotTable; AAdoptExisting: Boolean): Integer 可以在首次物化时显式采纳视图声明的前一矩形内既有的标量单元格;它不授权替换公式、数组成员、富文本、带元数据的单元格或该矩形之外的内容
所有权、缩放与移动
视图为写入的单元格保留精确坐标和类型化值快照;XLSX 保存把这份所有权记录进数据透视表定义,重新打开后仍可校验
类型化内容变化或被持有的非空单元格被删除会拒绝整个更新;数字子类型共享规范的数值表示,而文本、布尔值和错误保留各自独立的身份
缩小或移动结果只清理不再产出的未变更持有值;既有单元格对象、格式和批注保持可用,无关单元格留在所有权集合之外
修改 FirstRow 或 FirstCol 会移动下一次输出,而先前的所有权坐标仍可用于清理;空结果清空持有值并保留仅锚点的位置
隔离预览
function TXLSPivotTable.MakePreview(AWriter: TlxPivotResultWriter): Integer; property TXLSPivotTable.EvaluationSourceTable: TXLSPivotTable;
TXLSPivotTable.MakePreview 使用缓存与视图的独立副本(包括计算字段占位),求值后即丢弃;普通 Make 保持既有的活动缓存行为
写入器收到从零开始的行列偏移和类型化值;返回值沿用 Make 的聚合单元格计数,与写入器的调用次数无关;缓存或写入器缺失返回零,求值或写入器异常向外传播
调用方的记录谓词和已注册的所有者筛选在预览中同样生效,包括工作簿 Slicer 选择;回调收到的是临时求值视图及其临时缓存
TXLSPivotTable.EvaluationSourceTable 对普通求值返回活动视图,对预览返回原始活动视图;当回调需要识别所连接的视图时用它,而求值记录应从回调的临时 Cache 读取
回调所有者仍归调用方所有;回调或预览调用结束后不得继续保留预览对象及其记录
安全边界
物化要求视图与缓存注册在同一工作簿,且源是受支持的本地矩形、定义名称或表格;源解析跟随当前名称与表格范围,不受支持或无法解析的源在变更前被拒绝
当前源几何、其他数据透视表位置、结构化表格、查询结果区域、合并单元格以及固定或动态数组,都不得与新的输出或需要清理的旧持有单元格相交;表格总计即使不计入缓存记录也仍受保护
校验与输出暂存在读取租约下运行,随后是常规的工作簿变更保护与生成号检查;冻结的只读工作簿视图会拒绝物化,不替换单元格也不改变几何
筛选必须是只读的,并遵循工作簿常规的单写入者契约;隔离能防止普通预览计算改动活动缓存,但通过另行捕获的活动对象做出的任意回调写入无法回滚
该操作物化的是本库的计算结果布局;完整的原生数据透视表布局编写、Slicer UI 创建与交叉筛选无数据显示求值仍是独立能力