2011-04-29 119 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