找回密码
 立即注册

QQ登录

只需一步,快速开始

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2024-10-29 14:12  /   查看:53  /  回复:0
背景:


用户发现公式计算的计算结果与Excel不一致,经过调查发现用户的数据是字符串数字而非数字。在SpreadJS中字符串数字会参与部分公式的计算,例如SUM,但是Excel中字符串的数字会当成文本处理,不会参与计算。该差异导致公式计算与Excel的结果可能会出现不一致的情况。

原因:
SpreadJS在早期版本中支持过字符串的数字计算的功能(客户的需求),该功能最终导致计算上与Excel产生不一致的情况。
介于此,我们专门设置了一个开关,GC.Spread.CalcEngine.ExcelCompatibleCalcMode。
当GC.Spread.CalcEngine.ExcelCompatibleCalcMode = true 的时候,计算方式将使用Excel的规则进行(字符串数字不参与计算)。
该参数默认值为false(为了保持与旧版本的兼容)。
用户可以根据自行的需要进行设置,例如:
  1. sheet.setValue(0,0,"1");
  2. sheet.setValue(0,1,"2");
  3. sheet.setFormula(0,2,"=Sum(A1:B1)");
复制代码

image.png412308349.png
这里本别给A1和B1设置了字符串的数字"1"和"2",在默认的情况下(GC.Spread.CalcEngine.ExcelCompatibleCalcMode = false) 计算结果为3,字符串数字参与了计算。
将workbook导出Excel后,打开Excel,我们发现计算结果是0,字符串没有参与计算。
image.png946433410.png
当我们设置了GC.Spread.CalcEngine.ExcelCompatibleCalcMode = true后,这里有一点需要注意,如果该设置是在setFormula之后进行了,这个时候我们需要代码调用一下recalcAll(重算),因为该属性设置不会立刻影响公式计算,而是当下一次计算的时候会考虑该属性进行计算。反之则不用调用recalcAll。
计算完毕之后,SpreadJS中显示如下,已经与Excel保持一致了。
image.png450164489.png

值得注意的是处理字符串数字计算只是GC.Spread.CalcEngine.ExcelCompatibleCalcMode的其中一个功能,该接口设置之后SpreadJS会参照Excel的公式计算方式去进行计算,能够解决的问题肯定不止字符串计算这一种。所以一般来说,只要发现计算与Excel不一致的地方,可以先进行上述设置,然后看一下设置之后是否能够解决。

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部