非 OLAP 数据透视表 Slicer 选择
版本 2.384.88 为可绑定到普通本地缓存字段及其连接数据透视表视图的导入非 OLAP 数据透视表 Slicer 缓存增加了类型化成员选择
检查并修改选择
SlicerCache := Workbook.SlicerCaches.FindByName('SlicerCategory');
if (SlicerCache = nil) or not SlicerCache.IsNonOlapPivot then
raise Exception.Create('A non-OLAP Pivot Slicer cache is required');
if SlicerCache.SetSelectedItems([1]) <> 1 then
raise Exception.Create('Slicer selection could not be changed');
TXLSXSlicerCache.IsNonOlapPivot 识别表格型数据透视表形态;TXLSXSlicerCache.ItemCount、TXLSXSlicerCache.ItemCacheIndex 与 TXLSXSlicerCache.ItemSelected 暴露解析出的成员列表与选择
成员列表位置从零开始;每个 ItemCacheIndex 标识绑定数据透视表缓存字段中的一个共享成员,因此数字、文本、布尔、日期、空白和错误成员即使显示文本相同也保持各自的身份
TXLSXSlicerCacheItem 存储 CacheItemIndex: Integer 与 Selected: Boolean;TXLSXSlicerCacheItems 是其动态数组类型,而缓存通过只读索引属性暴露选择
TXLSXSlicerCache.SetSelectedItems 接受共享成员索引,成功返回 1,绑定不受支持、无效或不安全时返回 -1;空选择会被拒绝,因为文件格式要求至少一个选中成员
TXLSXSlicerCache.ClearSelection 沿用同样的状态约定并选中所有成员;它移除这条 Slicer 约束,同时保留其他字段上的独立限制
共享视图与既有筛选
一个 Slicer 缓存内被选中的成员构成并集;适用的 Slicer 缓存对每个显式连接的视图求交集,包括所选字段不在该视图显示轴上的情况;同一缓存的多个 UI Slicer 视图共享同一选择
带着应用自己的结果写入器调用 TXLSPivotTable.Make 即可计算当前结果;缓存选择变化不会重写工作表单元格,也不会重新生成每个导入的原生布局
Excel 把非 OLAP Slicer 选择存储为普通的数据透视表成员隐藏与页选择;格式中不记录某个隐藏标志是哪个操作产生的
修改导入绑定之前,HotXLS 会校验其旧的同字段隐藏与页掩码是否与旧 Slicer 的有效选择一致;一致的掩码按 Slicer 管理处理,不一致或含糊的掩码直接拒绝而不猜测;无关字段的手动、页与高级筛选保持生效
保存与源刷新
保存会一起更新 Slicer 选择与连接的数据透视表成员掩码,保留导入的 XML 命名空间和未知扩展,并把表连接重映射到其保存的身份;扩展的 Slicer 缓存标识符与普通工作簿数据透视表缓存标识符彼此独立
本地数据透视表缓存刷新保留选中的共享成员索引;显式子集排除新成员,而清除后的选择允许完整的刷新域
边界与失败行为
选择变更在提交前校验所有连接的视图与成员,并使用工作簿的变更保护;失败时既有的选择、视图限制与原始 XML 保持不变
添加、删除与清空 Slicer 缓存同样使用工作簿的写入保护;冻结的工作簿视图无法通过集合变更改变连接的数据透视表结果
删除绑定的非 OLAP 数据透视表缓存,或清空包含它的集合,都会在变更前被拒绝;显式的 RemoveSlicerCache 生命周期操作会移除其原生视图,并把选择清除或转移到普通数据透视表掩码
OLAP 与表格缓存选择、分组或计算源字段、缺失的连接、不一致的域以及含糊的导入同字段掩码仍在此操作之外;不受支持的缓存内容保留其原始表示
该选择 API 处理导入与受支持编写的数据透视表 Slicer 缓存;共享视图编写与显式缓存移除在 2.384.94 提供;安全工作表物化可以替换受支持的计算输出,而交叉筛选无数据显示求值仍是独立工作
删除绑定的非 OLAP 缓存的最后一个 UI 视图,会在改动其绘图、视图或缓存之前被拒绝;删除多个 UI 视图中的一个则保留共享的缓存与选择
清空工作表的 Slicer 视图会先检查每个受影响的缓存再移除任何视图;最后一个绑定视图导致原子拒绝,与其他工作表共享的视图保留其缓存与选择
附加记录筛选
TlxPivotRecordFilter = function(ATable: TXLSPivotTable; ARecordIndex: Integer): Boolean of object; procedure TXLSPivotTable.SetRecordFilter(AOwner: TObject; AFilter: TlxPivotRecordFilter); procedure TXLSPivotTable.ClearRecordFilter(AOwner: TObject); property TXLSPivotTable.ExternalRecordFilter: TlxPivotRecordFilter;
TXLSPivotTable.SetRecordFilter 为每个非 nil 所有者注册或替换一个回调,TXLSPivotTable.ClearRecordFilter 移除该所有者的回调;给 SetRecordFilter 传 nil 回调同样会移除
已注册的回调与可选的 TXLSPivotTable.ExternalRecordFilter 在表自身筛选与聚合之前求交集;工作簿独立注册自己的 Slicer 回调,因此不会覆盖调用方的谓词
回调收到从零开始的记录索引,每次 Make 调用都会对其快照,且不会被序列化或被 AssignPivotOnly 复制;所有者与回调目标归调用方所有,必须比注册存活得更久