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

У меня есть таблица с множеством формул в ней и несколькими вкладками. Одна из вкладок предназначена для ввода чисел в 10 полей. Другая вкладка предназначена для просмотра результатов вычисляемых формул.

Используя Apache POI, я открыл электронную таблицу и вводил мои номера. Проблема возникает, когда я пытаюсь оценить таблицу. я пробовал

FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); helper.createFormulaEvaluator(); evaluator.evaluateAll(); 

И я получаю сообщение об ошибке (для которого никто не отвечает): Unexpected arg eval type (org.apache.poi.ss.formula.eval.MissingArgEval)] with root cause

Поэтому я изменил оценку отдельных ячеек, чтобы найти, какая ячейка имеет ошибку, поэтому мой код выглядит так:

 FormulaEvaluator evaluator = this.workbook.getCreationHelper().createFormulaEvaluator(); for (Sheet sheet : this.workbook) { System.out.println("Evaluating next sheet"); System.out.println(sheet.getSheetName()); for (Row r : sheet) { System.out.println("Row Number:"); System.out.println(r.getRowNum()); for (Cell c : r) { if (c.getCellType() == Cell.CELL_TYPE_FORMULA) { System.out.println(c.getColumnIndex()); try { evaluator.evaluateFormulaCell(c); } catch (Exception e) { rowArray.add(r.getRowNum()); cellArray.add(c.getColumnIndex()); System.out.println("Skipping failed cell"); } } } } 

И я получаю ту же ошибку, что и при запуске метода оценки. Поместив там немного отладки, я обнаружил, что ошибка исходит от Cell L3, которая содержит формулу: =D5 . Поскольку оценщик идет по строке: столбец, он сначала оценивает все в строке 3, прежде чем доходит до 5, поэтому L3 ссылается на поле, которое еще не было оценено, и поэтому выдает ошибку.

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

Код повтора:

  // try to fix any failed evaluations here Iterator cellItr = cellArray.iterator(); Iterator rowItr = rowArray.iterator(); while (cellItr.hasNext()) { Integer cellElement = (int) cellItr.next(); Integer rowElement = (int) rowItr.next(); XSSFRow row = sheet.getRow(rowElement); XSSFCell cell = row.getCell(cellElement); System.out.println("Re-evaluating: " + rowElement + " : " + cellElement); evaluator.evaluateFormulaCell(cell); } } 

Код повтора дал тот же результат. Я попробовал изменить исходный оценщик, чтобы использовать метод оценкиInCell, чтобы изменить формулу на фактическое число, но это, похоже, не помогло.

—————– UPDATE ——————— Я только понял, что оценкаFormulaCell устарела в пользу оценкиFormulaCellEnum , Я поместил весь код в функцию и несколько раз запустил эту функцию и понял, что он снова и снова оценивает все ячейки, поэтому я переключился на использование метода оценкиInCell и обнаружил, что он оценивает каждую ячейку только один раз, но все равно не может получить передайте упомянутые ячейки. Вот мой обновленный код, который у меня есть внутри функции, которую я запускаю 5 раз:

 for (Sheet sheet : this.workbook) { System.out.println("Evaluating next sheet" + sheet.getSheetName()); for (Row r : sheet) { for (Cell c : r) { if (c.getCellType() == Cell.CELL_TYPE_FORMULA) { System.out.println("Cell index: " + r.getRowNum() + " - " + c.getColumnIndex()); try { evaluator.evaluateInCell(c); } catch (Exception e) { try { evaluator.evaluateFormulaCellEnum(c); } catch (Exception ee) { System.out.println("Skipping failed cell after 2 attempts"); } } } } } 

С помощью отладки, которую я получил, я смог увидеть, какие ячейки в электронной таблице были сбойными, поэтому я сохранил формулы из поврежденных ячеек в текстовом документе и заменил формулы их значениями, а затем перекомпилировал код и таблицу на самом деле оценены!

Затем я прошел через все ячейки и вернул их формулы два назад, пока они снова не сломались. Оказалось, что это был случай, о котором я уже знал, но поиск в электронной таблице – это не кусок пирога.

Это была формула с проблемой: =ROUNDUP('HW page'!$H$53*'HW page'!$H$54,) Я добавил 0 как последний параметр, чтобы он выглядел так: =ROUNDUP('HW assumptions'!$H$53*'HW assumptions'!$H$54,0) , то работает оценщик.

  • Метод Java Robot Framework и Selenium
  • Загрузите большой файл excel с помощью приложения Google для работы с приложениями в bigquery
  • Java (или Excel) - как выровнять столбчатые данные, которые не соответствуют порядку
  • невозможно добавить данные в существующие excel
  • JXLS не может считать число, длина которого больше 10
  • Проблема при копировании содержимого JTable в Excel
  • IllegalArgumentException при экспорте в Excel с использованием Apache POI Api
  • Экспорт в CSV / Excel в Java
  • Получение значений из ячейки файла Excell не работает
  • Как сравнить таблицу файлов excel и таблицу mysql и вставить данные в столбец mysql с помощью jsp?
  • Не удалось написать столбец строк excel (apache poi) несколькими циклами
  • Interesting Posts

    Код VBA для добавления строки в нижнюю часть таблицы в excel не только указанная строка на листе

    Создание листа excel из html-таблиц с помощью jquery

    предотвращение MS Excel от удаления ведущих нулей PHP 5.3

    Макрос для запроса рабочего листа и копирования выбранного рабочего листа для открытия рабочей книги

    Подключение данных Excel 2013 – только для чтения

    Невозможно заставить символ новой строки работать в XSLT в Excel

    Как создать столбец% variance в сводной таблице Excel 2010?

    Столбцы Excel подсчитывают значения, соответствующие значениям и значениям выше порогового значения

    Изменение кода от excel 2010 до Excel 2013 на .move

    Несколько инструкций IF AND excel

    Номера сортировки Excel с префиксом письма

    Какой самый быстрый способ загрузить лишний лист с более чем 100 000 строк кода на C #?

    excel vba для выполнения сценария R

    EPPLUS сдвигается вниз

    excell in C # – проблема с 2-мя листами

    Давайте будем гением компьютера.