本帖最后由 Wilson.Zhang 于 2024-9-18 14:07 编辑
PivotTable引用Table作为数据源实际上依赖的是Table的数据区(range),基于这一事实,当Table区域内的数据有所变化时,通过PivotTable:updateSource()可同步更新数据源。当Table区域有所扩展或回缩,通过PivotTable:updateSource()也可以同步更新数据源。扩展Table区域为PivotTable也引进了新数据,PivotTable范围也随之扩展。对Table删除某些数据,而Table数据区不变,待PivotTable:updateSource()后,被删除的数据在PivotTable中以“(空白)”代替,即PivotTable规模不变。
那么,Table区域的任何变动都能同步至PivotTable吗?如果在不直接支持的情况下,上完手段也能实现的话,也算是可以同步吧!探索一下在Table中对某列进行筛选后的结果如何同步至PivotTable,经测试发现,PivotTable:updateSource()对此无能为力了。因为PivotTable:updateSource()关注的是Table区域,而筛选并不改变Table区域范围,也不改变Table区域内的数据。与此同时,PivotTable列上的筛选框状态也与Table列上的筛选框状态不一致,Excel和SpreadJS对上述功能保持一致,如图1所示。
图1. Table筛选结果不同步至PivotTable
无论在Worksheet或Table,负责筛选的都是HideRowFilter行筛选器,行筛选器实时管理着筛选条件和被选中的数据项等和筛选相关的一切信息,那么试着从HideRowFilter寻找突破口。当Table中执行了筛选后,获取筛选信息,从中可了解到被筛选的列字段,进而将相同的筛选信息作用在PivotTable的筛选器上。当PivotTable的筛选器生效后,得到的数据便与Table中的筛选结果同步了。具体步骤如下:
1. 注册TableFiltered事件,监听被筛选的Table列及数据选项。
2. 根据被筛选的Table列索引,从Table中查询字段名称。
3. 遍历Workbook中每一张Worksheet:
3.1. 对每张Worksheet中的所有Table,检查其数据源是否为发生TableFiltered事件的Worksheet中的Table。
3.2. 如果是,则根据Table列筛选条件组装PivotTable筛选所需的信息。
3.3. 根据Table筛选列字段名称和从3.2步中得到的筛选信息,通过PivotTable:labelFilter()对PivotTable执行筛选。
遵循上述流程,便可将Table列的筛选结果同步至PivotTable,同时将Table列中的筛选信息也同步至PivotTable字段上的筛选框中,如图2所示:
图2. Table筛选结果同步至PivotTable
由此可见,Table的筛选结果和筛选框状态可以被同步至PivotTable。附上demo,以供参考。
|