Apache POI评估公式

我在表单的单元格中有一些公式,我想在插入一些值之后对它们进行评估。 例如:

我的公式是=SUM(B1,B2)

值插入前B1值为1B2值为3 ,公式结果为4

现在插入值后,B1的值是5 ,B2的值是2但公式仍然会产生4 ,我该如何评估/触发这个计算?

当然,当我按下公式单元格上的返回button时,会计算出新的值7 ,是否有办法在没有手动交互的情况下触发它?

我正在使用Excel 2007,所以XSSFWorkbook

编辑/更新:

我在发布之前使用了Gabors解决scheme,但是我将其用作参考,以下是发生的情况:

  Exception in thread "main" java.lang.NoSuchMethodError: org.apache.poi.ss.formula.WorkbookEvaluator.<init>(Lorg/apache/poi/ss/formula/EvaluationWorkbook;Lorg/apache/poi/ss/formula/IStabilityClassifier;Lorg/apache/poi/hssf/record/formula/udf/UDFFinder;)V at org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.<init>(XSSFFormulaEvaluator.java:64) at org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.<init>(XSSFFormulaEvaluator.java:51) ............... ............... 

以下是相关代码的一部分:

 public XSSFFormulaEvaluator getEvaluator(){ if(evaluator == null){ evaluator = new XSSFFormulaEvaluator(wb); } return evaluator; } 

实际上调用评估者:

 //where index is int, and mycell is int row = (XSSFRow) sheet.getRow(index); cell = row.createCell(mycell); getEvaluator().evaluateFormulaCell(cell); 

我正在寻找一个人使用这个,并成功,而不是那些谁没有真正尝试谷歌的解决scheme,我一直在谷歌search至less说。

根据加格拉瓦尔的build议,我的class级path上有两个兴趣点:

  <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8-beta1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.7</version> </dependency> 

我虽然我需要3.7版XSSF工作簿等

scheme:

 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8-beta2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.8-beta2</version> </dependency> 

为了促进对答案的评论…

你首先需要确保你正在使用相同版本的POI作为主jar和OOXML部分。 你的maven代码片段显示为3.7,另一个为3.8 beta 1。 你需要确保它们都是一样的。 (你甚至可以使用3.8-beta2)。

然后,使用:

 FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); evaluator.evaluateFormulaCell(cell); 

要么:

 XSSFFormulaEvaluator.evaluateAllFormulaCells(wb); 

有关更多详细信息,请参阅http://poi.apache.org/spreadsheet/eval.html

也许XSSFFormulaEvaluator .evaluateAllFormulaCells(XSSFWorkbook wb)

(或者更具体地说: evaluateFormulaCell(Cell cell)

如果它不起作用:您使用的是什么版本的POI? XSSF中的公式从v3.5开始支持。

另外,请尝试使用XSSFCreationHelper实例化POI文档build议的Formula Evaluator。

如果您使用HSSF尝试:

 HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook); 

你可以使用这个。

  public static void triggerFormula(HSSFWorkbook workbook){ FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); HSSFSheet sheet = workbook.getSheetAt(0); int lastRowNo=sheet.getLastRowNum(); for(int rownum=0;rownum<=lastRowNo;rownum++){ Row row; if (sheet.getRow(rownum)!=null){ row= sheet.getRow(rownum); int lastCellNo=row.getLastCellNum(); for(int cellnum=0;cellnum<lastCellNo;cellnum++){ Cell cell; if(row.getCell(cellnum)!=null){ cell = row.getCell(cellnum); if(Cell.CELL_TYPE_FORMULA==cell.getCellType()){ evaluator.evaluateFormulaCell(cell); } } } } } }