2011-04-29 144 views
1

我有一个模板XLS文件,我使用Apache POI加载并在其中写入大量数据,然后将其另存为另一个文件。 我在我的XLS文件的公式是这样的:Apache POI和SUMPRODUCT公式评估

=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")) 

这些评估正确,如果我按Enter键在Excel单元格中。 然而,简单地调用

HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook); 

似乎并没有对其进行评估,无论是在Excel不会“现在计算”按下按钮 - 所以我想这是一个特殊的公式或函数。

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

POI不支持数组公式。

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

回答

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贡献补丁以添加缺失的支持。关于需要什么的开发列表和bugzilla进行了一些讨论,如果您要发布到开发列表,那么我们很乐意帮助您开始。

否则,你可以只设置formula recalculation flag并获得Excel中重新计算负载

+0

不幸的是,重新计算标志没有任何影响。顺便说一句。 SUMPRODUCT不是一个数组函数,所以理论上POI可以工作......我很乐意为POI做出贡献,但是我需要尽快完成这个任务,并且现在无法使用它。 – egbokul 2011-05-02 11:50:20

+0

那么我建议你在POI bugzilla中为此打开一个新的bug,然后附上一个简单的单元测试(可能基于上面的代码),以显示问题。这会阻止它被人遗忘,即使你现在没有时间去处理它 – Gagravarr 2011-05-02 22:57:22

+0

好主意,我会这样做的。 – egbokul 2011-05-03 08:47:54