Apache POI评估公式
我在表单的单元格中有一些公式,我想在插入一些值之后对它们进行评估。 例如:
我的公式是=SUM(B1,B2)
值插入前B1
值为1
, B2
值为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); } } } } } }