Пересчет формул в электронной таблице с использованием Apache POI - PullRequest
4 голосов
/ 29 апреля 2011

Я пытаюсь использовать POI XSSF для оценки некоторых формул Excel.Значения не нужно сохранять, и мне, возможно, придется вычислить много формул, поэтому я пытаюсь сделать все это в одной и той же ячейке.

Проблема в том, что значение ячейки, похоже, застревает напервая формула введена даже после того, как я пересчитал

FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
XSSFCell formulaCell = row.createCell(6);
formulaCell.setCellFormula("Date(2011,10,6)");
CellValue cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());

formulaCell.setCellFormula("Date(1911,3,4)");
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());

Это выдает 40822,0 40822,0 (эквивалент Excel 10/06/2011) оба раза вместо переоценки на новую формулу.

Ответы [ 3 ]

5 голосов
/ 25 мая 2011

Если вы используете формулу Evaluator более одного раза, вам нужно эту строку между использованиями, иначе он использует один и тот же результат каждый раз.

formulaEvaluator.clearAllCachedResultValues()
2 голосов
/ 01 мая 2011

FormulaEvaluator кэширует вычисленные значения ячейки для ускорения обработки. Если вы выполняете обновления ячеек после создания оценщика, вам необходимо сообщить об этом!

Подробнее см. Документацию FormulaEvaluator . Для вашего случая попробуйте:

formulaCell.setCellFormula("Date(1911,3,4)");
evaluator.notifySetFormula(formulaCell);
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());
0 голосов
/ 14 июня 2017

Вы можете использовать следующие шаги, чтобы выполнить свою работу.Это два решения, из которых вы можете использовать любую функцию.Он оценивает всю рабочую книгу, поэтому любая формула, которую вы используете, будет оценена.Надеюсь, это поможет.

1) оценщик.evaluateAll ();2) XSSFFormulaEvaluator.evaluateAllFormulaCells (wb);

...