2012-04-03 68 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