找回密码
 立即注册

QQ登录

只需一步,快速开始

dev_wjx

初级会员

34

主题

100

帖子

352

积分

初级会员

积分
352
dev_wjx
初级会员   /  发表于:2024-4-23 18:01  /   查看:1645  /  回复:13
10金币

想实现在切入新sheet是挂起计算,然后编辑单元格后恢复计算
spread.options.calcOnDemand = true;
    spread.bind(GC.Spread.Sheets.Events.ActiveSheetChanging, function (e, args) {
          setTimeout(function () {
              spread.getSheetFromName(args.newSheet.name()+"").suspendCalcService();
          },1000)
    });

  spread.bind(GC.Spread.Sheets.Events.CellChanged, function (e, info) {
            setTimeout(function () {
                spread1.getActiveSheet().resumeCalcService(true);
            },1000)
        }
反复切换sheet后再编辑单元格计算恢复后公式却无法计算
       

13 个回复

正序浏览
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-4-28 08:56:47
14#
您好,我注意到您新开了一个帖子,那这个帖子就先结贴了,后续我们在新帖中跟进。

新帖链接:https://gcdn.grapecity.com.cn/fo ... read&tid=218001
回复 使用道具 举报
dev_wjx
初级会员   /  发表于:2024-4-26 17:51:03
13#

又不行了只要切换sheet次数多了就又无法计算了

sunlogin_20240426174754.zip

771.85 KB, 下载次数: 124

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-4-24 17:03:30
12#
刘老太 发表于 2024-4-23 18:01
试了一下V15确实有问题, 可以通过resume两次解决

回复 使用道具 举报
dev_wjx
初级会员   /  发表于:2024-4-24 15:07:46
11#
刘老太 发表于 2024-4-24 13:47
试了一下V15确实有问题, 可以通过resume两次解决

可以了
回复 使用道具 举报
dev_wjx
初级会员   /  发表于:2024-4-24 12:03:45
9#
刘老太 发表于 2024-4-24 11:28
原因在于suspend的时候每次会叠一层, resume的时候每次也只会解一层, 来回切sheet会导致suspend多层, 而 ...

还是不行,你是用的V15吗我用的15.2.2版本

含自持测算模型 - Google Chrome 2024-04-24 12-01-14.zip

9.9 MB, 下载次数: 159

回复 使用道具 举报
刘老太
注册会员   /  发表于:2024-4-24 11:28:00
8#
dev_wjx 发表于 2024-4-24 09:47
还是不行来回切换下sheet就导致单元格公式无法计算

原因在于suspend的时候每次会叠一层, resume的时候每次也只会解一层, 来回切sheet会导致suspend多层, 而设置的cellChanged的resume只会解掉一层, 使用以下代码可以解决这个问题
  1. spread.options.calcOnDemand = true;
  2. let suspendMap = {};
  3. spread.bind(GC.Spread.Sheets.Events.ActiveSheetChanged, function (e, args) {
  4.     let sheet = spread.getSheetFromName(args.newSheet.name()+"");
  5.     if (!suspendMap[sheet.name()]) {
  6.         sheet.suspendCalcService();
  7.         suspendMap[sheet.name()] = true;
  8.     }
  9. });
  10. spread.bind(GC.Spread.Sheets.Events.CellChanged, function (e, info) {
  11.     let sheet = spread.getActiveSheet();
  12.     sheet.resumeCalcService(true);
  13.     suspendMap[sheet.name()] = false;
  14. });
复制代码
回复 使用道具 举报
dev_wjx
初级会员   /  发表于:2024-4-24 09:47:03
7#
刘老太 发表于 2024-4-23 18:28
测试了一下这个逻辑没啥问题能跑

还是不行来回切换下sheet就导致单元格公式无法计算

含自持测算模型 - Google Chrome 2024-04-24 09-39-42.zip

9.43 MB, 下载次数: 159

含自持测算模型 - Google Chrome 2024-04-24 09-39-42.zip

9.43 MB, 下载次数: 168

回复 使用道具 举报
dev_wjx
初级会员   /  发表于:2024-4-23 18:35:10
6#
刘老太 发表于 2024-4-23 18:20
我的意思是, 你来回切, 加了很多timeout, 必然会导致异步出问题,
为了解决你的原始需求, 直接用activeSh ...

一样的,结果是一样的用activeSheetChanged事件也是都会导致第二次切入某一个sheet时计算恢复后公式也不计算
回复 使用道具 举报
刘老太
注册会员   /  发表于:2024-4-23 18:28:09
5#
测试了一下这个逻辑没啥问题能跑
  1. spread.options.calcOnDemand = true;
  2. spread.bind(GC.Spread.Sheets.Events.ActiveSheetChanged, function (e, args) {
  3.     spread.getSheetFromName(args.newSheet.name()+"").suspendCalcService();
  4. });
  5. spread.bind(GC.Spread.Sheets.Events.CellChanged, function (e, info) {
  6.      spread.getActiveSheet().resumeCalcService(true);
  7. });
复制代码
回复 使用道具 举报
刘老太
注册会员   /  发表于:2024-4-23 18:20:47
4#
dev_wjx 发表于 2024-4-23 18:16
这个加不加都一样的结果只是为了试错找出问题

我的意思是, 你来回切, 加了很多timeout, 必然会导致异步出问题,
为了解决你的原始需求, 直接用activeSheetChanged这个事件就可以了, 这个事件会发生在切换完成以后
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部