ApachePOI和SUMPRODUCT公式评估

ApachePOI和SUMPRODUCT公式评估,apache,excel,apache-poi,worksheet-function,array-formulas,Apache,Excel,Apache Poi,Worksheet Function,Array Formulas,我有一个使用ApachePOI加载的模板XLS文件,并在其中写入加载的数据,然后将其另存为一个文件。 我的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键,这些值将正确计算。 但是,只要打电话 HSSFFormulaEvalu

我有一个使用ApachePOI加载的模板XLS文件,并在其中写入加载的数据,然后将其另存为一个文件。 我的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中的“立即计算”按钮-所以我猜这是一个特殊的公式或函数

另一种更为传统的
COUNTIF
s和
SUMIF
s工作正常,但是它们不允许指定多个条件

POI不支持数组公式


有没有办法使这些工作。我使用的是POI 3.7版。

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

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


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

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

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


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

您可以按CTRL-ALT-F9在Excel中手动强制重新计算所有公式

下面是使它在工作簿打开时自动工作的技巧

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

+(NOW()*0)
例如,上面我的
SUMPRODUCT
变成

=SUMPRODUCT((DS!B:B="IN_THIS_ONLY")*(DS!D:D="New trade"))+(NOW()*0)
这很有效!Excel现在在open上重新计算我的特殊公式单元格

原因是
NOW()
是一个易失性函数。以下是我了解到这一点的地方:


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

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

下面是使它在工作簿打开时自动工作的技巧

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

+(NOW()*0)
例如,上面我的
SUMPRODUCT
变成

=SUMPRODUCT((DS!B:B="IN_THIS_ONLY")*(DS!D:D="New trade"))+(NOW()*0)
这很有效!Excel现在在open上重新计算我的特殊公式单元格

原因是
NOW()
是一个易失性函数。以下是我了解到这一点的地方:


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

遗憾的是,重新计算标志没有任何效果。顺便说一句,SUMPRODUCT不是数组函数,所以理论上POI可以工作。。。我很想为POI做出贡献,但我需要尽快完成,现在无法完成。我建议您为此在POI bugzilla中打开一个新的bug,并附加一个简单的单元测试(可能基于上面的代码)来显示问题。这将阻止它被遗忘,即使你现在没有时间处理它。遗憾的是,重新计算标志没有任何效果。顺便说一句,SUMPRODUCT不是数组函数,所以理论上POI可以工作。。。我很想为POI做出贡献,但我需要尽快完成,现在无法完成。我建议您为此在POI bugzilla中打开一个新的bug,并附加一个简单的单元测试(可能基于上面的代码)来显示问题。这将阻止它被遗忘,即使你现在没有时间去做