Apache POI оценивает ячейки в ErrorEval [#REF!], Но в рабочей книге нет #REF!ошибки - PullRequest
0 голосов
/ 07 июня 2019

Я вижу необычные ошибки при оценке ячеек в моей книге.Для контекста, 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 не поможет определить причину этого.При ручном вводе значений электронная таблица также рассчитывается правильно.

1 Ответ

0 голосов
/ 11 июня 2019

В листе Calc Table 2 FL формула OFFSET использовалась для очень большого запроса (более 255 столбцов). После изучения исходного кода Apache POI для createOffset мы смогли найти это:

    if (absRows.isOutOfBounds(0, 65535)) {
        throw new EvaluationException(ErrorEval.REF_INVALID);
    }

Таким образом, существует намеренное ограничение на количество столбцов в этой функции для POI. Я понятия не имею, почему, но определенно хотел бы услышать, почему это существует

...