原生数据透视表输出、交叉筛选查询与缺失成员
原生缓存工作表输出
function TXLSXWorkbook.MaterializeNativePivotTable( ATable: TXLSPivotTable): Integer; function TXLSXWorkbook.MaterializeNativePivotTable( ATable: TXLSPivotTable; AAdoptExisting: Boolean): Integer;
该操作在提交工作表值与输出所有权之前,先暂存完整的原生紧凑、表格或大纲报表网格及其 location、rowItems、colItems 与数据轴元数据;成功返回 1,状态不受支持或发生冲突时返回 -1 并附诊断
受支持的非空本地视图保留当前筛选、精确的缓存成员身份、普通层次结构、受支持的分组域、默认或自定义分类汇总以及任一受支持的数据轴;原生网格使用原始聚合值,不会重新组合显示的平均值或其他非加性结果
既有单元格对象与格式保持可用,而缩小或移动报表只清理未变更的先前持有值;被编辑的输出、源重叠、合并、公式、数组与其他报表会在变更前被拒绝
导入的标量输出需要用 AAdoptExisting=True 显式采纳;后续更新使用持久化的逐单元格所有权,保存与重新打开之后同样如此
该操作读取当前缓存记录,不刷新源数据也不重算公式;Cache.RefreshOnLoad=False 是合法的,因为工作表现在已包含实际暂存的原生结果
调用方的记录筛选回调参与分离预览,但在 OOXML 中没有表示;Excel 的显式原生刷新无法复现任意的回调限制,而受支持的持久化手动与 Slicer 筛选保留其线上表示
受支持的 SUM 计算缓存字段与缓存持有的计算项使用原生数据透视表计算字段与缓存持有的项所述的上下文求和契约;自定义成员标题与不受支持的布局组合会被显式拒绝,而受支持的生成原始布局保留无关 XML 与当前成员掩码
TryXLSXMakeNativePivotLayout(const Xml: WideString; Table: TXLSPivotTable; AWriter: TlxPivotResultWriter; out ResultXml, Reason: WideString): Boolean 是 lxPivotXml 中更低层的暂存布局帮助器
其写入器按行优先顺序接收整个报表矩形,包括空白单元格,偏移相对表锚点从零开始;XML 与网格预检在第一次回调之前完成,但回调抛出异常时调用方已写入的内容无法回滚
工作簿门面为事务性单元格更新提供一个分离的捕获写入器;组合的暂存预览与原生 Variant 网格以 4194304 个单元格为上限
原生预览路径可以通过 TXLSPivotTable.MakePreview 的可选 AUseNativeGrandTotals 参数请求原生总计方向;既有的单写入器与布局写入器调用保持先前行为
布局与重复标签
物化之前先在报表和每个行字段上设置 Compact 与 Outline;表格型字段两个标志都为 False,大纲型字段 Compact=False 且 Outline=True,紧凑型字段两个标志都为 True
property TXLSPivotField.RepeatLabels: Boolean;
RepeatLabels 默认 False,随字段独立复制,并读写原生 x14:pivotField fillDownLabels 扩展;它在表格与大纲输出中重复祖先标签,对紧凑与大纲标志同时开启的字段没有效果
每个独立行字段获得自己的物理列,相邻的紧凑大纲字段共享一个标签列;行上的多个度量遵循 CompactData,列上的多个度量保留独立的数据标题与总计
默认的表格型分类汇总出现在其组下方;大纲型 SubtotalTop 选择顶部或底部位置,而行上的度量使用组下方的独立聚合行并保留各度量的标题
原生缓存输出把缺失的行列交叉点留空,并保留真实的数字零;普通 Make 与未开启原生选项的预览保持先前的空结果行为
不活动字段与度量字段在暂存的原生元数据中继承报表布局,让 Excel 的显式刷新保留相应的字段与数据标题;该操作保留活动字段设置与既有的所有权检查
导入的重复标签扩展接受命名空间别名,包括扩展元素自身上的声明;未知无关 XML 仍被原生物化路径保留
分组成员、轴顺序与自定义分类汇总
原生输出支持由缓存既有类型化分组元数据表示的完整数字范围组、日期组与手动成员组;生成的标签精确保留导入的 GroupItemLabels,包括 Unicode 与本地化的日期标题
分组在分离缓存上求值,保留活动缓存的记录、共享项句柄与组身份;无效边界、零区间、不完整域或不受支持的组项值类型会在工作表输出改变之前被拒绝
既有的从零开始 TXLSPivotField.Position 决定稳定的原生行/列轴顺序;相同位置保持编写的字段顺序,因此使用默认位置的新建字段保持先前排序
原生导入的 Year/Month 与父级/手动成员层次结构保留其显式轴序列,同时缓存字段索引、视图字段索引与显示计算基础身份不变;手动组遵循显式的数据透视表项顺序,而不是对组标签或缓存索引排序
自定义行分类汇总支持 xlpsSum、xlpsCount、xlpsAverage、xlpsMax、xlpsMin、xlpsProduct、xlpsCountNumbers、xlpsStdDev、xlpsStdDevP、xlpsVar 与 xlpsVarP,包括多选函数、表格或大纲字段以及行上的度量
每个函数在自己的分类汇总作用域内聚合原始源记录;其暂存行元数据独立标识所选函数,保留 Excel 对非加性计算与空或错误结果的显式刷新行为
导入的自定义分类汇总选择会排除隐式自动分类汇总,即使原生 XML 中没有 defaultSubtotal;应用不得把 xlpsDefault 与自定义函数组合,这类含糊的类型化请求会在变更前被拒绝
带分类汇总的多列字段级别、不受支持的紧凑数据轴组合、折叠成员与自定义标题仍在此原生输出契约之外;计算字段与计算项有自己更窄的 SUM 与成员身份要求,原始保留不代表支持重算或物化某个特性
保存、重新打开与重新物化都保留受支持的分组、轴顺序与分类汇总身份;导入的原生视图与独立复制的类型化缓存也已在初次打开与显式刷新时对 Excel 做过验证
原生显示计算
调用 MaterializeNativePivotTable 之前,先设置每个普通数据字段的 ShowDataAs 或 ExtendedShowDataAs;基本与扩展显示模式互斥
基本模式包括差异、占基础项百分比、差异百分比、累计、占行/列/总计百分比与指数;扩展模式包括父级行、父级列与选定父级百分比、累计百分比以及升序或降序的密集排名
BaseField 是比较、累计、选定父级百分比与排名所用的从零开始数据透视表字段索引;比较使用从零开始的 BaseItem 位置,或用 xlPivotBaseItemPrevious 与 xlPivotBaseItemNext 表示有效显示顺序中的相邻可见成员
父级行与父级列百分比选择对应的最内层轴字段,不使用 BaseField;缺少对应轴时这些结果留空
简单百分比除以相关作用域内的原始聚合,包括非加性的平均值;累计百分比累加显示的成员聚合,最内层基础字段使用原始轴总计,外层基础字段使用其匹配剩余成员之和,因此平均值可能超过 100%
原生排名统计不同的前置聚合值;比较保留 Excel 对缺失交叉点、缺失基础、零除数以及前一个/后一个边界的空白与错误行为;简单百分比把缺失的分子视为零
总计使用所选模式的原生语义,包括比较或累计轴上的空白总计;修改显示模式仍保留报表的事务性所有权、冲突与预算检查
保存与重新打开保留所选的基本或扩展模式及基础身份,暂存的原生元数据支持 Excel 显式刷新;普通 Make 与未开启原生选项的预览保持既有的计算契约
Slicer 交叉筛选可用性
property TXLSXSlicerCache.ItemHasData[Index: Integer]: Boolean;
这个只读查询对当前受支持的非 OLAP 缓存记录求值,同时忽略该 Slicer 自身的选择,并保留其他 Slicer 选择、手动筛选、调用方谓词与适用的聚合筛选
可用性是各连接视图上的并集;没有匹配记录的历史成员无数据,空白度量无数据,而非空的文本、布尔、零、错误与日期度量按经过验证的原生契约计为有数据
查询使用读取租约与分离的记录预览,保留活动句柄与选择,并遵循 FormulaArrayMemoryLimit;回调失败、重入、无效绑定或不受支持的聚合计算成员会抛出异常且不提交活动变更
查询可用性不刷新缓存、不重算公式、不做文件 I/O,也不更新序列化的原生无数据标志;应用不应从这个只读操作推断原生 UI 状态
TlxPivotRecordWriter = procedure(ATable: TXLSPivotTable; ARecordIndex: Integer) of object; function TXLSPivotTable.MakeRecordPreview(AWriter: TlxPivotRecordWriter; AFilterOwner: TObject = nil; AFilter: TlxPivotRecordFilter = nil): Integer;
高级记录回调在受支持的简单与聚合筛选之后收到分离预览和从零开始的记录索引;EvaluationSourceTable 保留原始视图身份,返回值是发出的记录数
替换筛选只替换所提供所有者注册的回调;其他所有者与外部谓词保持生效,非 nil 的替换回调要求非 nil 的所有者
显式历史成员清除
Removed := Workbook.PurgePivotCacheMissingItems(
Pivot.CacheId, 0);
if Removed < 0 then
raise Exception.Create('The cache member purge was rejected');
TXLSXWorkbook.PurgePivotCacheMissingItems(ACacheId: Integer; ARetainMissingItemsPerField: Integer = 0): Integer 在完整校验并重映射受支持的链接视图与 Slicer 之后移除未使用的成员
它返回所有字段合计移除的共享项数量,成功的无操作返回零,被拒绝时返回 -1 并带诊断码 1402;当前记录保留每个被引用的成员,另按字段最多保留请求数量的未使用成员,选择时优先原始共享项索引最大者
保留的成员保持原始相对顺序与对象句柄,逻辑索引被压缩;链接的字段/项句柄、手动隐藏与明细标志、活动的页或比较成员以及 Slicer 选择都保留其身份
域标志与边界基于保留的域重新计算;受支持的导入压缩行列与页位置被显式重映射,而总计占位引用与数据伪字段序号保持不变
普通的完整本地工作表缓存受支持;分组、计算、成员属性、OLAP、外部、不完整或含糊的缓存以及不受支持的不透明身份元数据会在变更前被拒绝
移除活动的页或比较成员、整个选中的 Slicer 子集,或先前非空的有效交叉点,都会以原子方式拒绝;类型化重建中会丢失的原始成员属性同样被拒绝
既知的物化所有权扩展保持不变,因为其坐标与类型化值标记不含缓存成员索引;无关的不透明扩展不被假定为安全
清除不刷新源数据、不重写工作表报表单元格、不调用记录回调,也不自动应用 MissingItemsLimit 元数据;刷新保持只追加,除非显式请求此操作
高级清除协调
TXLSPivotCache._PrepareMissingItemPurge 返回不透明的 TXLSPivotCachePurgePlan;应用通常应使用工作簿门面,确保每个链接视图与 Slicer 都被纳入
MapItem 与 RemainingItemCount 检查缓存重映射,StagePivotField 注册链接字段并返回其暂存索引,MapViewItemPosition 检查该字段的线上位置映射;被移除的成员映射到 -1,RemovedCount 报告合计移除数量
Validate 检查原始模式、记录、字段/项所有权身份与暂存的视图选择;Commit 再次校验并在第一次活动交换之后无分配、无回调地转移已准备的所有权
计划持有分离的快照,保持其可变暂存缓存私有,从不拥有原始缓存或视图对象;在计划的 Destroy 释放暂存之前保持那些原始对象存活,且每个计划只能提交一次
被拒绝的字段暂存会回滚该阶段,计划因此可以复用;准备完成后的不受支持变更会在提交前被拒绝