Ячейка Excel не обновлена ​​правильно

Я использую apache-poi для изменения ячейки Excel (с помощью setCellValue) и получения значения cellM14, значение которого зависит от измененной ячейки. Когда я вручную открываю Excel, ячейка CellM14 обновляется правильно, но когда я пытаюсь ее распечатать System.out.println("Updated Value at M14: " + cellM14.getNumericCellValue()); печатается старое значение cellM14. Я не могу использовать Formula Evaluator, так как возникла ошибка с именованием, см.: FormulaEvaluatorFormulaParseException Выражение «C.aRG» в точечном диапазоне (полная строка или столбец) должно содержать ровно 2 точки.

Может ли кто-нибудь помочь мне распечатать обновленную версию cellM14?

String filePath = "file";
        try (FileInputStream fileInputStream = new FileInputStream(new File(filePath));
             XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream)) {
            Sheet sheet = workbook.getSheet("input");
            workbook.setForceFormulaRecalculation(true);

            // Check if Row 13 exists and print original value if the cell exists
            Row row13 = sheet.getRow(13);
            if (row13 != null) {
                Cell cellM14 = row13.getCell(11);
                if (cellM14 != null) {
                    System.out.println("Original Value at M14: " + cellM14.getNumericCellValue());
                } else {
                    System.out.println("Cell M14 is null.");
                }
            } else {
                System.out.println("Row 13 is null.");
            }

            // Change the value in cell H5 (row index 4, column index 7)
            Row row4 = sheet.getRow(4);
            if (row4 == null) {
                row4 = sheet.createRow(4);
            }
            Cell sub = row4.getCell(7);
            if (sub == null) {
                sub = row4.createCell(7);
            }
            sub.setCellValue("nanoparticle");

            // Save workbook
            try (FileOutputStream fileOutputStream = new FileOutputStream(new File(filePath))) {
                workbook.write(fileOutputStream);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        try (FileInputStream fileInputStream = new FileInputStream(new File(filePath));
             XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream)) {
            workbook.setForceFormulaRecalculation(true);
            try (FileOutputStream fileOutputStream = new FileOutputStream(new File(filePath))) {
                workbook.write(fileOutputStream);
            }
            Sheet sheet = workbook.getSheet("input");

            // Check if Row 13 exists and print original value if the cell exists
            Row row13 = sheet.getRow(13);
            if (row13 != null) {
                Cell cellM14 = row13.getCell(11);
                if (cellM14 != null) {
                    System.out.println("Updated Value at M14: " + cellM14.getNumericCellValue());
                } else {
                    System.out.println("Cell M14 is null.");
                }
            } else {
                System.out.println("Row 13 is null.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

Apache-POI не работает как Excel. Когда вы открываете Excel, M14 обновляется, поскольку книга автоматически запускает перерасчет. Но если вы установите значение ячейки, от которой зависит M14, без пересчета через Apache POI, метод get все равно покажет старое значение - Excel на самом деле сделал бы то же самое, если бы пересчет не был запущен. Вам следует переоценить ячейку с помощью FormulaEvaluator, чтобы получить правильный результат.

Matteo NNZ 26.06.2024 10:44

Единственная проблема заключается в том, что я не могу использовать FormulaEvaluator из-за ошибки в именовании stackoverflow.com/questions/78651059/…. Есть ли другой способ сделать это?

cost p 26.06.2024 11:25

Внесите в проект исправление ошибки с именованием, с которой вы столкнулись? Заплатить кому-нибудь, чтобы он починил это за вас?

Gagravarr 27.06.2024 03:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В конце концов я нашел способ сохранить файл .xslx с помощью VB SCRIPT, и формулы теперь правильно оцениваются при доступе к ячейке M14 (хотя это не самое оптимальное решение, оно выполняет свою работу).

Другие вопросы по теме