Я вижу необычные ошибки при оценке ячеек в моей книге. Для контекста POI используется для ввода значений в книгу Excel с использованием определенных имен. Затем Excel берет входные данные и выполняет различные вычисления и поиск для расчета набора выходных сумм, которые обрабатываются по-разному в зависимости от того, какому штату США он соответствует. Проблема, которую я вижу, заключается в том, что когда оценивается определенный набор листов (в этом контексте мы будем использовать штат Флорида), их ячейки оцениваются как org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
и, таким образом, разбивают все выходные значения. Обычно, когда я получаю неправильные выходные данные, я могу быстро найти их, сохранив электронную таблицу после вставки всех входных данных, оценив рабочую книгу (используя evaluateAll()
), а затем сохранив обновленную версию «отладчика» на моем локальном компьютере. Проблема с этим, однако, заключается в том, что когда я проверяю обновленную версию, мои выходные суммы, кажется, были успешно рассчитаны, и я не вижу никакого #RREF! ошибки в любом месте рабочей книги.
Использование различных комбинаций входных значений, которые указывают только на определенный набор листов, вызывает ошибку.
Изменение способа оценки листов из функции FormulaEvaluators evaluateFormulaCell(cell)
, а затем синтаксический анализ ответа в переключателе, возвращающем значение ячейки в виде строки, на простое использование evaluateAll()
.
Удаление всех внешних ссылок на рабочие книги и удаление условного форматирования на потенциально проблемных листах.
Включение журналов POI, чтобы попытаться найти основную причину проблемы.
очистка кэшированных значений с помощью FormulaEvaluator clearAllCachedResultValues()
перед выполнением оценки.
И, наконец, убедитесь, что ни одна из электронных таблиц не содержит неподдерживаемых формул POI с FunctionEval getSupportedFunctionNames()
и getNotSupportedFunctionNames()
.
Это первые журналы POI, в которых отображается проблема ErrorEval[#REF!].
...
DEBUG - Evaluated Assumed Census!C41 to org.apache.poi.ss.formula.eval.NumberEval [0.0714285714285714]
DEBUG - Evaluated Lookup Table 1!D41 to org.apache.poi.ss.formula.eval.NumberEval [0.0662525879917184]
DEBUG - Evaluated Lookup Table 1!E41 to org.apache.poi.ss.formula.eval.NumberEval [0.13768115942029]
DEBUG - Evaluated Lookup Table 1!E57 to org.apache.poi.ss.formula.eval.NumberEval [0.0196687370600414]
DEBUG - Evaluated Calc Table 2 FL!O4 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!O88 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!E165 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!D165 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!D198 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!Q4 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!Q88 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!E167 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!D167 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!D200 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!P4 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!R4 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!R88 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!E168 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
...
Кроме того, именно так электронная таблица в настоящее время оценивается.
when (evaluator.evaluateFormulaCell(cell)) {
CellType.NUMERIC -> cell.numericCellValue
CellType.STRING -> cell.stringCellValue.toString().toDoubleOrNull() ?: 0.0
CellType.BOOLEAN -> cell.booleanCellValue.toString().toDoubleOrNull() ?: 0.0
CellType.ERROR -> cell.errorCellValue.toString().toDoubleOrNull() ?: 0.0
else -> cell.toString().toDoubleOrNull() ?: 0.0
}
Ожидаемые результаты — это значения в выходных ячейках листа отладчика, но вместо этого выходные значения в результатах равны 0 или 23. Электронная таблица отладчика не содержит #REF! ошибок после обработки входных данных и оценки POI, вместо этого он показывает допустимые значения, которые я обычно ожидал.
ОБНОВЛЕНИЕ: Также попытался изменить оценку, чтобы использовать evaluator.evaluate(cell).cellType
в операторе switch, и теперь в электронной таблице отладчика отображается #REF! везде; однако просмотр всех ошибок в Excel на самом деле не помогает указать основную причину этого. При вводе значений вручную электронная таблица также рассчитывается правильно.