#java #excel #apache-poi #xssf #hssf
#java #преуспеть #apache-poi #xssf #хссф #excel #hssf
Вопрос:
Я пытаюсь использовать 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 от 6.10.2011) оба раза вместо повторной оценки по новой формуле.
Ответ №1:
Если вы используете FormulaEvaluator более одного раза, вам понадобится эта строка между использованиями, иначе каждый раз будет использоваться один и тот же результат.
formulaEvaluator.clearAllCachedResultValues()
Ответ №2:
FormulaEvaluator кэширует вычисленные значения в ячейках для ускорения обработки. Если вы выполняете обновления ячеек после создания средства оценки, то вам нужно сообщить об этом!
Смотрите документацию по FormulaEvaluator для получения более подробной информации. В вашем случае попробуйте:
formulaCell.setCellFormula("Date(1911,3,4)");
evaluator.notifySetFormula(formulaCell);
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());
Ответ №3:
Вы можете выполнить следующие шаги, чтобы выполнить свою работу. Это два решения, из которых вы можете использовать любую одну функцию. Он оценивает всю рабочую книгу, поэтому любая формула, которую вы используете, будет оценена. Надеюсь, это поможет.
1) evaluator.evaluateAll(); 2) XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);