请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Alvin

初级会员

40

主题

121

帖子

359

积分

初级会员

积分
359

微信认证勋章

[已处理] 公式不计算

Alvin
初级会员   /  发表于:2016-3-9 11:58  /   查看:4379  /  回复:9
两个问题:
   1.11行跟12行是同样的公式:=SUMBD() 调用recalcAll方法 12行没有计算呢? 跟代码看问题是循环的时候12公式没走,但是12行是有的?
   2.如何让单元格中的 0 不显示?
QQ截图20160309115402.png
QQ截图20160309115724.png

9 个回复

倒序浏览
CCKan
银牌会员   /  发表于:2016-3-9 12:02:39
沙发
这样吧,你尝试在定义 custom function 的时候,设置一下 options里面的
isVolatile: function(){return true}
试试看,这个 option 的意思就是任意值变化的时候都会重算,recalcAll 也没必要调了。
你看看是否问题解决了。
回复 使用道具 举报
Alvin
初级会员   /  发表于:2016-3-9 13:54:06
板凳
CCKan 发表于 2016-3-9 12:02
这样吧,你尝试在定义 custom function 的时候,设置一下 options里面的
isVolatile: function(){return t ...

没太明白你说的要怎么写, 我现在是这么写的
$.wijmo.wijspread.Calc.Functions.defineGlobalCustomFunction("SUMBD",  function(args, context){
                                return XXXXX();
                        },{
                                override:true,
                                isContextSensitive: function(){return true;}
                        }
                );

改成下面这样吗?
$.wijmo.wijspread.Calc.Functions.defineGlobalCustomFunction("SUMBD",  function(args, context){
                                return XXXXX();
                        },{
                                override:true,
                                isContextSensitive: function(){return true;},
                                isVolatile: function(){return true}
                        }
                );

回复 使用道具 举报
Alvin
初级会员   /  发表于:2016-3-9 16:06:54
地板
CCKan 发表于 2016-3-9 12:02
这样吧,你尝试在定义 custom function 的时候,设置一下 options里面的
isVolatile: function(){return t ...

问题计算的时候没有循环12行的公式,所以没有计算,  这是为什么呢,明明有公式?
回复 使用道具 举报
CCKan
银牌会员   /  发表于:2016-3-9 16:53:43
5#
是的,就是改成3楼那样试试。

公式计算的逻辑非常复杂,特别是你这种用法并不是通常用法的情况下,所以根据描述我们也不知道什么地方有问题。如果可以的话,你做一个能够重现问题的 Sample,我们再帮你看什么原因。
回复 使用道具 举报
Alvin
初级会员   /  发表于:2016-3-10 09:13:22
6#
CCKan 发表于 2016-3-9 16:53
是的,就是改成3楼那样试试。

公式计算的逻辑非常复杂,特别是你这种用法并不是通常用法的情况下,所以 ...

   2.如何让单元格中的 0 不显示?可以设置整个sheet中的 0 都不显示吗
回复 使用道具 举报
CCKan
银牌会员   /  发表于:2016-3-10 10:36:34
7#
你可以重写 CellType 的 format 函数:
            var oldFormat = GcSpread.Sheets.TextCellType.prototype.format;
            GcSpread.Sheets.TextCellType.prototype.format = function (value) {
                if (value === 0) {
                    return "";
                }
                return oldFormat(value);
            }
回复 使用道具 举报
Alvin
初级会员   /  发表于:2016-3-10 11:19:12
8#
CCKan 发表于 2016-3-10 10:36
你可以重写 CellType 的 format 函数:
            var oldFormat = GcSpread.Sheets.TextCellType.proto ...

回复 使用道具 举报
Alvin
初级会员   /  发表于:2016-3-10 17:24:11
9#
CCKan 发表于 2016-3-10 10:36
你可以重写 CellType 的 format 函数:
            var oldFormat = GcSpread.Sheets.TextCellType.proto ...

可不可以设置公式计算的时机,比如在整个表加载完成之后再执行公式??
现在不知道公式是什么时候执行的
回复 使用道具 举报
CCKan
银牌会员   /  发表于:2016-3-10 18:18:10
10#
SpreadJS 本来就是所有数据加载完毕(在 spread.fromJSON() 的最后)后才会计算一次,否则会有性能问题。
如果你自己想在其它地方也做类似的事(比如一次设置一批单元格的值),你可以在开始的时候调 sheet.suspendCalcService(), 结束的时候调 sheet.resumeCalcService()
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部