Я вижу необычные ошибки при оценке ячеек в моей книге.Для контекста, POI используется для ввода значений в книгу Excel с использованием определенных имен.Затем Excel принимает входные данные и выполняет различные вычисления и поиски, чтобы вычислить набор выходных сумм, который обрабатывается по-разному в зависимости от того, какому штату США он соответствует.Проблема, которую я вижу, заключается в том, что при оценке определенного набора листов (в этом контексте мы будем использовать штат Флорида), их ячейки оцениваются как org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
и, таким образом, разбивают все выходные значения.Обычно, когда я получаю неправильные выходные данные, я могу быстро найти их, сохранив электронную таблицу после вставки всех входных данных, оценив рабочую книгу (используя evaluateAll()
), а затем сохранив обновленную версию «отладчика» на моем локальном компьютере.Однако проблема заключается в том, что когда я проверяю обновленную версию, мои выходные суммы, кажется, были рассчитаны успешно, и я не вижу #RREF!ошибки в любом месте рабочей книги.
Использование различных комбинаций входных значений, показанных только для определенного набора листов, приводит к ошибке.
Изменение оценки листов с помощью функции FormulaEvaluators evaluateFormulaCell(cell)
, затем анализ ответа в переключателе, который возвращает cellValue в виде строки, на простое использование 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 не поможет определить причину этого.При ручном вводе значений электронная таблица также рассчитывается правильно.