Apache POI评估公式

时间:2011-04-19 12:55:18

标签: java excel apache-poi

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

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

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

现在插入值后,B1的值为5,而B2的值为2,但公式仍然生成4,如何计算/触发此值?

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

我正在使用excel 2007 XSSFWorkbook

编辑/更新:

我在发布之前使用了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);

我正在寻找使用过这个并且成功的人,而不是那些谷歌解决方案没有真正尝试过的人,我至少在谷歌上写了很多话。

Per Gagravar建议我的课程路径上有2个POI:

        <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工作簿等。

解决方案:

<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>

4 个答案:

答案 0 :(得分:15)

宣传回答评论......

首先需要确保您对主jar和OOXML部分使用相同版本的POI。你的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

答案 1 :(得分:3)

也许XSSFFormulaEvaluator .evaluateAllFormulaCells(XSSFWorkbook wb)

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

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

另外,请尝试使用XSSFCreationHelper按照POI docs的建议实例化您的公式评估员。

答案 2 :(得分:0)

如果您使用HSSF,请尝试:

HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);

答案 3 :(得分: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);
                                }
                            }
                         }
                 }
                }


            }