找回密码
 立即注册

QQ登录

只需一步,快速开始

rex_chujie
金牌服务用户   /  发表于:2021-11-1 02:29  /   查看:6164  /  回复:22
本帖最后由 Derrick.Jiao 于 2021-11-1 09:55 编辑

如demo中所示,当点开页面,点击刷新当前E4,单元格显示64354是正确结果也就是说如附件中正常加载.html第89行加载test数据时计算结果正确,但是如果采用91行到108行代码重新执行上述过程时加载计算结果为-,这是为什么,test数据其实就是出计算问题后通过toJSON导出来得第0个sheet数据,简单来说就是整体加载一个sheet得json加载时没问题,但是分成多步加载既有问题
企业微信截图_16357047921053.png196591796.png

spreadJsDemo.7z

1.87 MB, 下载次数: 511

22 个回复

正序浏览
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-12-13 10:00:12
23#
经最后的确认,该行为不属于产品bug。不应该调用reset来清除公式,应该用clear方法。请参考下面的代码,然后之前另一个帖子所提到的reset方法应该替换为clear。
  1.    spread.suspendPaint();        // 暂停计算服务
  2.         spread.suspendCalcService(false);

  3.         sheet10.clear(-1,-1,-1,-1, 3 /*viewport*/, 1 /*just clear data*/);
  4.         sheet10.fromJSON( data10 );
  5.         sheet11.clear(-1,-1,-1,-1, 3 /*viewport*/, 1 /*just clear data*/);
  6.         sheet11.fromJSON( data11 );
  7.         data2.forEach( dataItem=>{
  8.           const { row,col,value } = dataItem;
  9.           console.log(row,col,value);
  10.           sheet11.setValue(row,col,value);
  11.         })

  12.         // 开启计算服务
  13.         spread.resumeCalcService(true);
  14.         spread.resumePaint();
复制代码


回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-11-30 16:25:19
22#
rex_chujie 发表于 2021-11-30 15:41
如果我在其他逻辑中对该sheet的操作也同样需要绘制挂起,那还需要继续将resumeCalcService里面的参数置为fa ...

其他操作不需要recalcAll,主要原因是在于reset会将计算依赖清除。也就是在reset之后,执行recalcAll(true)就可以了,除非再次调用reset,否则只在最后使用一次即可。
回复 使用道具 举报
rex_chujie
金牌服务用户   /  发表于:2021-11-30 15:41:31
21#
如果我在其他逻辑中对该sheet的操作也同样需要绘制挂起,那还需要继续将resumeCalcService里面的参数置为false,然后再调用recalcAll(true)么,还是说reset之后,执行recalcAll(true)一次就可以保证后续公式计算的正确性了
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-11-30 15:11:34
20#
rex_chujie 发表于 2021-11-26 16:39
请问下这个reset方法调用之后是不是每次暂停计算服务开启服务之后都需要手动调用一下recalcAll方法,如附件 ...

请试一下这个workaround,在最后恢复绘制之后重算一把即可。另外,只需使用一对suspend和resume即可,无需在同一段代码中使用大量的绘制挂起。这个方案这边也测试之后,即使是修改单元格值也会自动重算,无需手动重算。请验证该demo,若仍存在问题,请再将复现的demo提供我们继续测试。

正常加载.html

2.04 KB, 下载次数: 204

回复 使用道具 举报
rex_chujie
金牌服务用户   /  发表于:2021-11-30 14:26:59
19#
好的,麻烦尽快,因为这个导致上线的项目实际使用过程中一系列的公式计算问题
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-11-30 13:56:51
18#
rex_chujie 发表于 2021-11-30 11:49
我发现reset方法调用之后不仅仅是是每次暂停计算服务开启服务之后都需要手动调用一下recalcAll方法,我每次 ...

这边也重现了你描述的问题,主要原因还是最开始计算的bug导致。workaround能让绕开某个场景,但是可能对其他场景会不起作用,最根本还是这个待修复的bug。我们这边也提高了这个问题的优先级,尽快将这个问题修复。另外,我们这边也再看是否有更加合适的workaround可以绕开这个问题。有进展这边也会第一时间在本帖更新。
回复 使用道具 举报
rex_chujie
金牌服务用户   /  发表于:2021-11-30 11:49:29
17#
本帖最后由 rex_chujie 于 2021-11-30 11:51 编辑

我发现reset方法调用之后不仅仅是是每次暂停计算服务开启服务之后都需要手动调用一下recalcAll方法,我每次修改包含被公式引用单元格值的内容,都需要调用recalcAll方法么
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-11-26 17:04:32
16#
rex_chujie 发表于 2021-11-26 16:39
请问下这个reset方法调用之后是不是每次暂停计算服务开启服务之后都需要手动调用一下recalcAll方法,如附件 ...

是的,目前的workaround需要重算一下。目前我们也找到了原因,当调用reset时,将为单元格formula设置一个空表达式,从而将单元格添加到脏链中。当恢复CalcService时,calcChain中将有旧单元格。这部分目前涉及计算引擎相关的内容,涉及的内容比较大,需要更多的时间去修复。我们这边修复后也会第一时间更新帖子告知。
回复 使用道具 举报
rex_chujie
金牌服务用户   /  发表于:2021-11-26 16:39:18
15#
请问下这个reset方法调用之后是不是每次暂停计算服务开启服务之后都需要手动调用一下recalcAll方法,如附件中所示,点完刷新之后折旧与长摊sheet页H12单元格计算不出来结果,但是加上recalcAll方法就是好的,顺便问一下这个问题修复进度如何

spreadJsDemo.7z

1.99 MB, 下载次数: 333

回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部