首页 文章

Apache POI和SUMPRODUCT公式评估

提问于
浏览
1

我有一个模板XLS文件,我用Apache POI加载并在其中写入大量数据,然后将其另存为另一个文件 . 我的XLS文件中有公式,如下所示:

=SUMPRODUCT((DS!B:B="IN_THIS_ONLY")*(DS!D:D="New trade"))

也试过了

=SUMPRODUCT(0+(DS!B:B="IN_THIS_ONLY"),0+(DS!D:D="New trade"))

如果我在Excel中的单元格上按Enter键,这些评估正确 . 但是,只需打电话

HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);

似乎没有评估它们,也没有按下Excel中的“立即计算”按钮 - 所以我想这是一个特殊的公式或函数 .

另一个更传统的 COUNTIFSUMIF 可以正常工作,但是这些不允许指定多个条件 .

POI不支持数组公式 .

有没有办法让这些工作 . 我正在使用POI版本3.7 .

2 回答

  • 4

    可以按 CTRL-ALT-F9 在Excel中强制手动重新评估所有公式 .

    这是让它在工作簿上自动运行的技巧 .

    将以下内容添加到您的公式中:

    +(NOW()*0)
    

    所以例如,我的 SUMPRODUCT 就变成了

    =SUMPRODUCT((DS!B:B="IN_THIS_ONLY")*(DS!D:D="New trade"))+(NOW()*0)
    

    这有效! Excel现在重新计算我打开的特殊公式单元格 .

    原因是 NOW() 是一个易失性函数 . 这是我了解到的地方:http://msdn.microsoft.com/en-us/library/bb687891.aspx

    Application.CalculateFull 也可以,但仅适用于Excel 2007及更高版本(当然,必须启用宏才能运行) . 不幸的是,在我的情况下,即使我使用Excel 2007,我的工作簿也将由Excel 2003用户打开,所以这不是一个选项 .

  • 2

    SumProduct是基于数组的公式函数吗?

    如果是这样,那就可以解释这个问题 . 一种选择是向POI提供补丁以添加缺少的支持 . 关于dev列表和bugzilla已经讨论了需要什么,如果你要发布到开发列表,那么我们很乐意帮助你开始 .

    否则,您可以设置formula recalculation flag并让Excel重新计算加载时的值

相关问题