Apache POI оценить формулу - PullRequest
       0

Apache POI оценить формулу

9 голосов
/ 19 апреля 2011

У меня есть несколько формул в ячейках моего листа, и я хочу оценить их после того, как я вставлю некоторые значения.Пример:

Моя формула =SUM(B1,B2)

До вставки значений B1 значение было 1, B2 значение было 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);

Я ищу кого-то, кто использовал это и был успешным, а не тех, ктоРешение Google, не пытаясь его использовать, я, по крайней мере, много гуглял.

За Гагравару меня есть 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 ]

15 голосов
/ 19 апреля 2011

Для продвижения комментария к ответу ...

Во-первых, вам нужно убедиться, что вы используете ту же версию POI для основной банки и часть OOXML. Ваш фрагмент maven показывал 3.7 для одного и 3.8 бета 1 для другого. Вы должны убедиться, что они оба одинаковы. (Вы могли бы даже хотеть использовать 3.8-бета2, который только что вышел).

Затем используйте либо:

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

или

XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);

Подробнее см. http://poi.apache.org/spreadsheet/eval.html

3 голосов
/ 19 апреля 2011

Возможно XSSFFormulaEvaluator .evaluateAllFormulaCells(XSSFWorkbook wb)?

(или более конкретно: evaluateFormulaCell(Cell cell).)

Если это не работает: какая версия POI выс помощью?Формулы в XSSF поддерживаются начиная с версии 3.5.

Также попробуйте использовать XSSFCreationHelper для создания экземпляра средства оценки формул в соответствии с рекомендациями POI .

0 голосов
/ 23 декабря 2014

Вы можете использовать это.

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


            }
0 голосов
/ 04 мая 2013

если вы используете HSSF, попробуйте:

HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);
...