2011-04-19 167 views
8

我在我的工作表的单元格中有一些公式,我想在插入一些值后对它们进行评估。例: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> 
+1

NoSuchMethodError指示我在您的类路径中有两个POI jar副本。确保你只有一个,那么它应该工作正常 – Gagravarr 2011-04-19 13:18:36

+0

@Gagravarr请参阅我的更新 – ant 2011-04-19 13:28:42

+0

这是你的问题。您的POI版本需要匹配。对于主要POI罐子和poi-ooxml罐子,你都需要3.8-beta1(或者更好的3.8-beta2)。版本之间不能混用和匹配POI罐子! – Gagravarr 2011-04-19 13:38:39

回答

12

提升为答案评论...

您首先需要确保您使用的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更多细节

+2

这将有望帮助一些可怜的灵魂在那里,谢谢 – ant 2011-04-19 13:53:32

+0

从2017年的问候:)谢谢你的答案!这正是我一直在寻找的:)在poi 3.17和'formulaEvaluator.evaluateInCell(cell);不推荐使用FYI'evaluateFormulaCell';而应该使用''。 – 2017-09-23 21:52:59

+0

@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

3

也许XSSFFormulaEvaluator.evaluateAllFormulaCells(XSSFWorkbook wb)

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

如果它不工作:您正在使用什么版本的POI的? XSSF中的公式受v3.5支持。

此外,请尝试使用XSSFCreationHelper实例化您的Formula Evaluator,如POI docs建议的那样。

+0

请不要告诉我只是使用Google?你真的用过这个成功吗? – ant 2011-04-19 13:16:19

+0

请参阅http://poi.apache.org/spreadsheet/eval.html - Gabor建议应该工作得很好。 – Gagravarr 2011-04-19 13:19:18

+0

@Gagravarr我已经做了,你有没有用过这个成功? – ant 2011-04-19 13:20:58

0

HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook); 
0

您可以使用Ť他的。

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); 
           } 
          } 
         } 
       } 
       } 


      }