给定一个由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