Я использую 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();
}
Единственная проблема заключается в том, что я не могу использовать FormulaEvaluator из-за ошибки в именовании stackoverflow.com/questions/78651059/…. Есть ли другой способ сделать это?
Внесите в проект исправление ошибки с именованием, с которой вы столкнулись? Заплатить кому-нибудь, чтобы он починил это за вас?
В конце концов я нашел способ сохранить файл .xslx с помощью VB SCRIPT, и формулы теперь правильно оцениваются при доступе к ячейке M14 (хотя это не самое оптимальное решение, оно выполняет свою работу).
Apache-POI не работает как Excel. Когда вы открываете Excel, M14 обновляется, поскольку книга автоматически запускает перерасчет. Но если вы установите значение ячейки, от которой зависит M14, без пересчета через Apache POI, метод get все равно покажет старое значение - Excel на самом деле сделал бы то же самое, если бы пересчет не был запущен. Вам следует переоценить ячейку с помощью FormulaEvaluator, чтобы получить правильный результат.