2012-04-03 97 views
3

給定一個由Coldfusion 9通過Apache POI生成的交叉表公式的工作簿。在Coldfusion/Apache POI中強制完整計算整個工作簿

我想以編程方式強制整個工作簿做一個「完全計算與依賴樹重建」之前將工作簿保存到磁盤。

所以,當我的最終用戶打開電子表格,他們沒有按Ctrl鍵 - Alt鍵 - - F9

如何在coldfusion中完成此操作?

參考文獻:

回答

7

不幸的是沒有簡單的答案,這一個。

選項1:

我認爲最短的路線是使用CreationHelper.createFormulaEvaluator().evaluateAll()。不幸的是,它在CF9中不可用。該方法是在POI的後續版本中添加的,而不是與CF9一起發佈的版本。 setForceFormulaRecalculation()同樣適用。您可以使用JavaLoader.cfc來加載更新版本的POI。然後你可以訪問這些方法。但是這可能比你想要的更多的參與這一項任務。

選項2:

如果做不到這一點,如果你知道正確的順序,你可以通過表迭代,並重新計算公式爲每一個:

wb = sheet.getWorkBook(); 
evaluator = wb.getCreationHelper().createFormulaEvaluator(); 
// you could also use an array of sheet names instead 
for(sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) { 
    poiSheet = wb.getSheetAt(sheetNum); 
    rows = poiSheet.rowIterator(); 
    while (rows.hasNext()) { 
     r = rows.next(); 
     cells = r.cellIterator(); 
     while (cells.hasNext()) { 
      c = cells.next(); 
      if (c.getCellType() == c.CELL_TYPE_FORMULA) { 
       evaluator.evaluateFormulaCell(c); 
      } 
     } 
    } 
} 

方案3:

另一種可能性是用宏自動填充模板recalculates when the workbook opens。顯而易見的缺點是它依賴於宏。但由於它是由Excel本身執行的,所以它可能是最可靠/最可靠的選項。

+0

我幾年沒有使用過ColdFusion,但是對於舊版本,我們總是習慣從CF庫中刪除舊的POI罐,然後放入新的罐。你不能這樣做嗎? – Gagravarr 2012-04-04 09:56:39

+0

當然,你仍然可以。我沒有提出這個建議,因爲我沒有用CF9做過。這可能沒有問題,但我會首先推薦一些測試,因爲所有新功能都有可能會破壞其他功能。全部取決於POI版本的後向兼容性。 – Leigh 2012-04-04 15:48:43

+0

如果我能夠十次提出這個答案,我會的。 (我與選項2,順便說一句) – 2012-04-10 19:41:07