Clark.Pan 发表于 2024-10-29 14:12:57

公式计算如何与Excel保持一致

背景:


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

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

这里本别给A1和B1设置了字符串的数字"1"和"2",在默认的情况下(GC.Spread.CalcEngine.ExcelCompatibleCalcMode = false) 计算结果为3,字符串数字参与了计算。
将workbook导出Excel后,打开Excel,我们发现计算结果是0,字符串没有参与计算。

当我们设置了GC.Spread.CalcEngine.ExcelCompatibleCalcMode = true后,这里有一点需要注意,如果该设置是在setFormula之后进行了,这个时候我们需要代码调用一下recalcAll(重算),因为该属性设置不会立刻影响公式计算,而是当下一次计算的时候会考虑该属性进行计算。反之则不用调用recalcAll。
计算完毕之后,SpreadJS中显示如下,已经与Excel保持一致了。


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