給定一個由Coldfusion 9
通過Apache POI
生成的交叉表公式的工作簿。在Coldfusion/Apache POI中強制完整計算整個工作簿
我想以編程方式強制整個工作簿做一個「完全計算與依賴樹重建」之前將工作簿保存到磁盤。
所以,當我的最終用戶打開電子表格,他們沒有按Ctrl鍵 - Alt鍵 - 移 - F9。
如何在coldfusion
中完成此操作?
參考文獻:
給定一個由Coldfusion 9
通過Apache POI
生成的交叉表公式的工作簿。在Coldfusion/Apache POI中強制完整計算整個工作簿
我想以編程方式強制整個工作簿做一個「完全計算與依賴樹重建」之前將工作簿保存到磁盤。
所以,當我的最終用戶打開電子表格,他們沒有按Ctrl鍵 - Alt鍵 - 移 - F9。
如何在coldfusion
中完成此操作?
參考文獻:
不幸的是沒有簡單的答案,這一個。
選項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本身執行的,所以它可能是最可靠/最可靠的選項。
我幾年沒有使用過ColdFusion,但是對於舊版本,我們總是習慣從CF庫中刪除舊的POI罐,然後放入新的罐。你不能這樣做嗎? – Gagravarr 2012-04-04 09:56:39
當然,你仍然可以。我沒有提出這個建議,因爲我沒有用CF9做過。這可能沒有問題,但我會首先推薦一些測試,因爲所有新功能都有可能會破壞其他功能。全部取決於POI版本的後向兼容性。 – Leigh 2012-04-04 15:48:43
如果我能夠十次提出這個答案,我會的。 (我與選項2,順便說一句) – 2012-04-10 19:41:07