Nano Hash - криптовалюты, майнинг, программирование

Apache POI оценивает ячейки как ErrorEval [#REF!], но в рабочей книге результатов нет #REF! ошибки

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


  • Сначала #REF! попал из ячейки 'Calc Table 2 FL'!O4. Так какая формула в этой ячейке? Я подозреваю формулу, которая ссылается на любую из других ячеек, которые оцениваются в #REF!. Итак, какие формулы находятся в 'Calc Table 2 FL'!O88, 'Input Sheet'!E165, 'Input Sheet'!D165 и 'Input Sheet'!D198? 08.06.2019

Ответы:


1

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

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

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

11.06.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..