2010-03-25 306 views
4

我嘗試設置引用其他工作簿單元格的單元格公式。但是,當我打開以編程方式生成的工作簿時,公式單元格顯示爲#REF !.我打印出在日誌中生成的公式。如果我剪切和粘貼那些進入細胞內,從外部工作簿的數字被拉入。Java apache poi設置單元格公式

 String formula = "'C:\\tmp\\ForecastAggregate\\Total Products\\[ForecastWorksheet.xls]2010 Budget'!C10"; 
     HSSFCell cell = row.createCell(0); //row was created above 
     cell.setCellFormula(formula); 

能anybode幫助嗎?

回答

1

我給了一個快速測試從工作表讀取一個公式來工作,它出來,而不單引號,如:!

[TEST.XLS] testsheet A1

當我試圖設置,作爲一個公式,但是,我得到了一個錯誤:在線程

異常「主」了java.lang.RuntimeException:名爲「TEST.XLS」鏈接無需外部工作簿似乎暗示,當您閱讀使用外部參照的公式時,需要將工作簿加載到公式評估程序中並設置環境。不過,我想這一點,但它仍然沒有工作...但它可能是一些看:

// Set up the workbook environment for evaluation 
HSSFFormulaEvaluator ev = new HSSFFormulaEvaluator(testwb); 
String[] workbookNames = { "test.xls", }; 
HSSFFormulaEvaluator[] evaluators = { ev, }; 
HSSFFormulaEvaluator.setupEnvironment(workbookNames, evaluators); 

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.html

1

可以解決此問題通過使用動態評價加時賽參考,通過INDIRECT功能。

INDIRECT函數計算單元格的值,其中要評估的單元格是從另一個單元格的值中提取的。

例如,

  1. 在單元格A1,把你的單元格引用爲純文本(未式),例如「 'C:\ tmp目錄\ ForecastAggregate \產品總數\ [ForecastWorksheet.xls] 2010年預算'!C10」
  2. 在A2,你想要的是引用單元格出現的值的單元格,把公式

    =間接(A1)

這將從A1中獲取目標單元格並在A2中顯示其值。

在Java中,您可以創建一個模式,在其中創建單獨的工作表(例如「indirectRef」)來管理間接索引。無論何時寫入對單元格的外部引用時,都會寫入INDIRECT(xx)並將引用放入單元格xx中的「indirectRef」工作表中。鑑於Poi主要是接口,您可以在Java電子表格生成器代碼中無需更改代碼的情況下透明地執行此操作。

Excel也有一個EVALUATE宏,可以動態地評估公式,這會更容易工作,但這是官方無證的(但在其他地方有廣泛記載!)並且可能不支持所有版本的Office。

希望這會有所幫助!