找回密码
 立即注册

QQ登录

只需一步,快速开始

Margin

注册会员

6

主题

19

帖子

158

积分

注册会员

积分
158
Margin
注册会员   /  发表于:2019-7-9 20:32  /   查看:9232  /  回复:10
1金币
树形的表格,需要实现计算、汇总经费列的数据的功能。
计算、汇总分两种情况:
1. 末级行(无下级的行)
  经费的计算规则是:经费 = 数量 * 单价;
  汇总的规则是:当前级的所有行经费相加,就是直接上级行(非末级行)经费单元格的值。
2. 非末级行(首行除外)
  由于非末级行的经费是直接下级汇总得来的,所以非末级行不能使用“经费 = 数量 * 单价”的公式,
  非末级行经费的汇总就是首行的经费值。

总的来说就是一个递归向上汇总的功能。

以图片中的树形表格为例:
  第四、五、七行(末级行)的经费=数量 * 单价;
  第六行的经费 = 第七行的经费
  第三行的经费 = 第四行经费 + 第五行经费
  第二行的经费 = 第三行经费 + 第六行经费
  第一行的经费 = 第二行的经费

本人已实现的树形表格在附件,未实现向上汇总功能。

20190709200554.png

SpreadSheetUsage.zip

3.4 KB, 下载次数: 663

最佳答案

查看完整内容

补充一个Demo 第三列实现分级汇总

评分

参与人数 1金币 +20 收起 理由
葡萄城三幺三 + 20 感谢您使用悬赏贴功能,小小心意还请收下,.

查看全部评分

10 个回复

倒序浏览
最佳答案
最佳答案
Fiooona
论坛元老   /  发表于:2019-7-9 20:32:02
来自 11#
补充一个Demo
第三列实现分级汇总

features_worksheet_outline_outline-column_JavaScript (5).zip

3.65 KB, 下载次数: 657

组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2019-7-10 11:11:13
2#
问题已收到,今天内回复您
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
Margin
注册会员   /  发表于:2019-7-10 15:00:32
3#
Fiooona 发表于 2019-7-10 11:11
问题已收到,今天内回复您

请问有结果了吗?
回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2019-7-10 17:56:57
4#
提供一个解决的思路:
遍历每一行,可以获取当前行的所有子节点,然后设置公式,用subTotal公式来求和,公式中传入子节点区域。
https://demo.grapecity.com.cn/sp ... .html#SUBTOTAL.html
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
Margin
注册会员   /  发表于:2019-7-12 09:53:34
5#
Fiooona 发表于 2019-7-10 17:56
提供一个解决的思路:
遍历每一行,可以获取当前行的所有子节点,然后设置公式,用subTotal公式来求和,公 ...

感谢提供的解决思路,公式也已实现。
但有一个问题:绑定了数据源然后再给某些单元格设置公式之后,公式没有起作用,需要聚焦单元格或者编辑某些单元格,公式才会计算。在resumePaint之前调用WorkBook.reCalAll()也不管用
回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2019-7-12 10:51:35
6#
你设置公式是在resumePaint之前设置的嘛? 如果设置了suspendPaint是暂停了绘制,这个当中设置公式是不会重绘的,可以在暂停绘制之前设置公式,如果还有问题,可以上传下Demo,看具体在哪里影响了绘制
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
Margin
注册会员   /  发表于:2019-7-12 11:21:19
7#
Fiooona 发表于 2019-7-12 10:51
你设置公式是在resumePaint之前设置的嘛? 如果设置了suspendPaint是暂停了绘制,这个当中设置公式是不会重 ...

对,是在resumePaint之前设置的,流程伪代码如下:
// 设置表头及绑定字段(有公式的单元格也绑定了字段)
suspendPaint();
addSpan();
addSpan();
...
resumePaint();
// 异步请求获取到了数据data后
suspendPaint();
  1. setDataSource(data);
  2. // 遍历data
  3. for (let i = 0; i < data.length; i++) {
  4.   const item = data[i];
  5.   /* 如果这条item不是末级行,给当前行某个单元格设置公式,是末级行,去除公式或去除公式 */
  6.   if( data.someKey) {
  7.     activeSheet.getRange(i, 1, 1, 1).formula('=SUBTOTAL(9,Axx,AXX)');
  8.   } else {
  9.     activeSheet.getRange(i, 1, 1, 1).formula(null);
  10.   }
  11. }
  12. resumePaint();
复制代码
回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2019-7-12 12:22:06
8#
本帖最后由 Fiooona 于 2019-7-12 12:24 编辑

你可以在附件的例子里复现下你的问题嘛?看你的代码暂时无法定位问题。

分组列.zip

13.55 KB, 下载次数: 669

组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
Margin
注册会员   /  发表于:2019-7-20 22:14:54
9#
Fiooona 发表于 2019-7-12 12:22
你可以在附件的例子里复现下你的问题嘛?看你的代码暂时无法定位问题。

问题已经找到了。字符串数字"2.123"等,在使用公式计算时,不会转换成Number,在公式里使用VALUE函数就会自动计算了。结帖吧
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部