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 中的“立即计算”按钮 - 所以我想这是一个特殊的公式或函数。

其他更传统COUNTIF的 s 和SUMIFs 工作正常,但是这些不允许指定多个条件。

POI 不支持数组公式。

有什么办法可以使这些工作。我正在使用 POI 3.7 版。

4

2 回答 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()是一个 volatile 函数。这是我了解到这一点的地方:http: //msdn.microsoft.com/en-us/library/bb687891.aspx

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

于 2011-05-02T11:48:36.687 回答
2

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

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

否则,您可以设置公式重新计算标志并让 Excel 重新计算加载值

于 2011-05-01T07:50:43.537 回答