找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-24 14:57  /   查看:1063  /  回复:2
本帖最后由 Lynn.Dou 于 2023-5-15 15:22 编辑

问题1:recalcAll 仅是针对sheet中的公式进行的重算吗?

不仅是。
之所以该接口在sheet中设置,是因为在某些场景下(如下代码),sheet还未加入到spread中,所以此时的计算引擎只在sheet范围内作用。
  1. var sheet  =  new GC.Spread.Sheets.Worksheet();
  2. xxxxxxx
  3. sheet.recalcAll();
  4. spread.addSheet(0, sheet);
复制代码
而当sheet已加入spread时,sheet会将自身的calc service与spread上的calc service进行合并。
全局的calcservice将托管此类工作,计算引擎的内部就不会再区分spread级别还是sheet级别了。
也就是说,此时执行sheet.recalcAll() 实质上是对整个spread内的公式进行了重算。

(细心的小伙伴可能注意到,对于 suspendCalcService/resumeCalcService 也是有 sheet级别 和 spread级别 的,原理同上)

问题2:recalcAll 传参 true 表示什么?


API说明:传参true 表示重建所有公式引用、自定义名称和自定义函数

这里面涉及到底层的计算逻辑,举个例子:
你在单元格中输入了 =test ,但是这个自定义名称 test 还未加入到customname中,
所以此时单元格会显示 #NAME
这个时候公式已经构建完毕,后续将test加入到customname,执行重算也不会得到正确的结果。
所以此时就需要传参 true,即执行 recalcAll(true),将公式重新进行构建,并重算。


问题3:recalcAll 传参 false 表示什么?


recalcAll 传参 false  等同于 recalcAll 不传参,基于问题2,在不需要重新构建公式的情况下,可以这样使用。






2 个回复

倒序浏览
athenadeveloper
注册会员   /  发表于:2023-7-12 14:54:33
沙发
请问根据以上描述,
recalcAll 和resumeCalcService这俩api是不是都是所有sheet页都会计算?

目前使用getActiveSheet().recalcAll(true);这样用,会导致计算所有sheet页的函数 。

有没有办法只计算当前sheet。
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-7-12 16:21:47
板凳
athenadeveloper 发表于 2023-7-12 14:54
请问根据以上描述,
recalcAll 和resumeCalcService这俩api是不是都是所有sheet页都会计算?

您好,目前不支持这样的API。

当sheet被添加到spread中以后就无法再单独计算了,只能整个spread中的所有sheet都进行计算。
SpreadJS 17.0.8 | GcExcel 7.1.1 已发布~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部