Apache POI评估公式
我在我的工作表的单元格中有一些公式,我想在插入一些值后对它们进行评估。例:Apache POI评估公式
我的公式是=SUM(B1,B2)
之前值插入B1
值为1
,和B2
值为3
,以及公式结果是4
后的值的插入现在B1具有值5
,和B2有价值2
但公式仍然产生4
,我该如何评估/触发这个计算?
当然,当我按下公式单元格上的返回按钮时,计算出新值7
,有没有办法在没有手动交互的情况下触发?
我使用的是2007年Excel,以便XSSFWorkbook
编辑/ UPDATE:
我用Gabors的解决方案,他的贴吧,但我用它作为参考之前,这里是发生了什么:
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);
我找人用这个,是成功的,而不是那些谁谷歌的解决方案没有真正尝试它,我一直在谷歌上搜索了很多,至少可以说。
每Gagravar建议,我有我的类路径中的POI 2:
<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工作簿等
SOLUTION:
<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相同版本的主缸,和OOXML的一部分。你的maven代码片段显示为3.7,另一个显示为3.8 beta 1。你需要确保他们都是一样的。 (你甚至可能想要使用3.8-beta2)。
然后,使用:
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
evaluator.evaluateFormulaCell(cell);
或:
XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
,如果你使用HSSF尝试见http://poi.apache.org/spreadsheet/eval.html更多细节
这将有望帮助一些可怜的灵魂在那里,谢谢 – ant 2011-04-19 13:53:32
从2017年的问候:)谢谢你的答案!这正是我一直在寻找的:)在poi 3.17和'formulaEvaluator.evaluateInCell(cell);不推荐使用FYI'evaluateFormulaCell';而应该使用''。 – 2017-09-23 21:52:59
@VladimirVagaytsev我认为你错了 - [evaluateFormulaCell](http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/FormulaEvaluator.html#evaluateFormulaCell-org.apache.poi.ss。 usermodel.Cell-)仍然未被弃用! 'evaluateInCell'做了一些不同的事情,它用eval的结果替换了公式 – Gagravarr 2017-09-27 15:00:15
也许XSSFFormulaEvaluator.evaluateAllFormulaCells(XSSFWorkbook wb)
?
(或者更具体地说:evaluateFormulaCell(Cell cell)
)
如果它不工作:您正在使用什么版本的POI的? XSSF中的公式受v3.5支持。
此外,请尝试使用XSSFCreationHelper实例化您的Formula Evaluator,如POI docs建议的那样。
:
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);
}
}
}
}
}
}
NoSuchMethodError指示我在您的类路径中有两个POI jar副本。确保你只有一个,那么它应该工作正常 – Gagravarr 2011-04-19 13:18:36
@Gagravarr请参阅我的更新 – ant 2011-04-19 13:28:42
这是你的问题。您的POI版本需要匹配。对于主要POI罐子和poi-ooxml罐子,你都需要3.8-beta1(或者更好的3.8-beta2)。版本之间不能混用和匹配POI罐子! – Gagravarr 2011-04-19 13:38:39