apache poi求值公式

cotxawn7  于 2021-06-27  发布在  Java
关注(0)|答案(4)|浏览(476)

我在工作表的单元格中有一些公式,我想在插入一些值后对它们求值。前任:
我的公式是 =SUM(B1,B2) 插入值之前 B1 价值是 1 ,和 B2 价值是 3 ,公式结果为 4 插入值后,b1现在有值 5 ,b2有价值 2 但是这个公式仍然产生 4 ,如何计算/触发该值?
在我点击公式单元格上的return按钮之后,新的值 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);

我要找的人使用这个,是成功的,而不是那些谁谷歌解决方案没有真正尝试它,我一直在谷歌很多说,至少。
根据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>
b91juud3

b91juud31#

你可以用这个。

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

            }
b4qexyjb

b4qexyjb2#

如果您使用hssf,请尝试:

HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);
zkure5ic

zkure5ic3#

也许xssfformulaevaluator .evaluateAllFormulaCells(XSSFWorkbook wb) ?
(或者更具体地说: evaluateFormulaCell(Cell cell) .)
如果不起作用:你用的是什么版本的poi?xssf中的公式受v3.5支持。
另外,尝试使用xssfcreationhelper来示例化poi文档建议的公式计算器。

csbfibhn

csbfibhn4#

将评论提升为答案。。。
首先需要确保主jar和ooxml部分使用相同版本的poi。你的maven代码片段一个显示3.7,另一个显示3.8beta1。你要确保它们是一样的(你甚至可能想使用3.8-beta2(刚刚推出)。
然后,使用:

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

或:

XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);

看到了吗http://poi.apache.org/spreadsheet/eval.html 更多细节

相关问题