公式计算结果和office不一致

计算结果为2,而office计算结果为0,并且附件中的公式计算wb.calculateFormula(true);非常慢耗时。

    public static void main(String[] args) throws Exception {
        String path = "C:\\test\\test.xlsx";
        FileInputStream fis = new FileInputStream(path);
        Workbook wb = new Workbook(fis);
        Cells cells = wb.getWorksheets().get(0).getCells();
        wb.calculateFormula(true);
        String value = cells.get("B2").getStringValue();
        System.out.println(value);
        fis.close();
        wb.dispose();
    }

test.zip (7.6 KB)

@baicai
通过使用样例文件和代码进行测试,我们能够复现问题。发现调用Workbook.calculateFormula(true)方法后,得到错误的计算结果。

我们已经在内部问题跟踪系统中打开了以下新问题单,并将根据Free Support Policies中提到的条款提供修复。

问题单号: CELLSJAVA-45774

在您的文件中,实际保存的公式形式为:
=SUM(COUNTIFS(Sheet2!A:A,A:A,Sheet2!B:B,{“two”,“five”}))
但是当在excel中打开这个文件时,这个公式自动被修改为:
=SUM(COUNTIFS(Sheet2!A:A,@A:A,Sheet2!B:B,{“two”,“five”}))
实际上如果您为Sheet1!B2设置的是这样的公式形式的话,我们的计算结果也将是0而不是2.

然而,如果您在excel中直接输入文件中保存的那种形式的公式,您将发现excel将长时间的处于计算状态中。实际上excel执行的是跟我们的计算一样的逻辑,并没用添加’@‘符号,这将导致计算1048576*2个COUNTIFS函数的和,所以计算这个公式是非常耗时的。这同样也表明,原始的公式形式是合法的并且excel也正常接受它。所以我们不能像excel那样自动修改公式,也许用户设计这个公式的时候就是需要像它的原始形式那样去使用它。

如果您需要的是当前excel打开这个文件时的效果,请直接在公式中使用正确的’@‘符号,比如直接使用如下公式字符串设置到cell上:
=SUM(COUNTIFS(Sheet2!A:A,@A:A,Sheet2!B:B,{“two”,“five”}))

谢谢,意思是用户公式没有用标准的公式语法是吗,用户使用wps excel是没有任何卡顿的有可能wps excel做了优化,但是我用office excel确实计算的是出现了卡顿计算了1048576*2次。

@baicai
不客气。感谢你的反馈。MS-Excel和WPS在公式上是有一些细微区别的,比如公式的写法和内部处理逻辑等。Aspose.Cells遵从MS-Excel规范,如果遇到问题,请以MS-Excel为准。如果你有任何疑问,请随时联系我们。