找回密码
 立即注册

QQ登录

只需一步,快速开始

Wilson.Zhang
超级版主   /  发表于:2024-9-18 08:54  /   查看:326  /  回复:0
Table在一定程度上让数据活起来了,但程度很有限,只是针对每列抽取了其中的数据项供人快速筛选或排序、支持多种简单函数统计该列的数据特征。如果我们想在Table中通过更复杂的计算规则利用数据呢?显然不是简单的单列统计了,可能涉及到多列的混合运算。SpreadJS支持500多种计算公式,即便这些计算公式不能满足实际需求,也可以自定义公式定制化实现之。人是主观能动性的集大成者呀,发挥能动性反向赋能Table。

举个栗子:近期电影院里群英荟萃呐,国产剧情片《逆行人生》、港式喜剧《食神》、谍战片《解密》、泰式剧情片《姥姥的外孙》、现象级犯罪剧情片《孤注一掷》等影片在最近参与了人们的生活,有家影院(没错,就是影院名字)的经理看着系统生成的Table中记录着的近一周的播映数据,想统计每部影片累计一周的票房,对票房高的增加排片量,把握机会好好赚一笔。播映数据包括日期、影片名称、出票数、票价等特征,根据这样的数据特征,每部影片一周的票房等于一周内该影片的每日出票数和票价乘积之和,可以通过SUMPRODUCT公式计算。有了SUMPRODUCT公式,不仅可以快速了解每部影片的一周票房,同样也可以了解影院的一周总票房。不过,我们发现当筛选了某部具体的影片后,SUMPRODUCT公式在汇总行中的结算结果不变,仍然是影院一周票房数值,如图1所示。经过一番调研了解到,除了Table内支持的汇总行公式外,其他SpreadJS公式的计算结果不受筛选影响。看来,要解决这个问题,唯有自定义公式来是实现了。好在天无绝人之路,SpreadJS的计算引擎支持自定义公式,要不说“引擎”就是高大上呢!

image.png479651793.png

图1. 筛选前后SUMPRODUCT函数计算结果不变

思路清晰了,解决方案就出炉了,合理利用SpreadJS支持的特性自定义一个SUMPRODUCT公式,专用于在Table中汇总一周票房。参考SUMPRODUCT的计算规则自定义公式,由其发于SUMPRODUCT而命名为CUSTOMSUMPRODUCT,解决方案的具体思路如下:
1. 获取Worksheet中Table占用的区域,确定筛选行列范围。
2. 从Table数据区域的首行到尾行,遍历其中每行。
3. 检查当前行是否可见(被筛选中即可见,未被筛选中则不可见),如果可见则先计算当前行内出票数和票价的乘积。
4. 将每行内的乘积结果累加起来,便可得到筛选中数据行内的总票房,即指定影片的一周票房统计结果。
5. 至此,完成自定义CUSTOMSUMPRODUCT函数,将其添加至当前Workbook的计算引擎。
6. 在当前Worksheet注册TableFiltered事件,在事件处理函数中重新计算自定义CUSTOMSUMPRODUCT函数即可。

上述流程可以解决SUMPRODUCT函数不同步筛选结果更新导致的不一致问题,如图2所示。欲使用其他计算规则在Table的汇总行统计某些维度的数据特征,也如上思路,文末附上上述思路的实现demo。

image.png713163451.png

图2. 自定义SUMPRODUCT函数计算筛选项

在Table中自定义SUBTOTAL函数(Designer版本).html

8.37 KB, 下载次数: 13

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部