POI 4.1.1 setCellFormula не показывает окончательное значение - PullRequest
1 голос
/ 06 февраля 2020

Ранее я использовал POI 3.1.7 с setCellFormula без каких-либо проблем. Теперь я перешел на 4.1.1 и заметил, что хотя ячейка правильно устанавливает формулу, она не отображает никаких значений (например, для ячейки задан формат «Учет», ячейка показывает = PRODUCT (I4 * L4), на экране он показывает $ -. Код выглядит следующим образом:

XSSFCell cell = null;
cell = row.createCell(12);
cell.setCellFormula("PRODUCT(I"+(processingRow+1)+",L"+(processingRow+1)+")");
cell.setCellStyle(getCellStyle("ACCOUNTING", sheet, true,true, false,false));

Кстати, я использую его в Excel 2013 (что, я думаю, не должно иметь никакого влияния?). Если я если в ячейку формулы ввести go и нажать клавишу ввода в конце формулы, только тогда значение будет отображаться так, как должно быть. Я что-то упустил?

1 Ответ

0 голосов
/ 06 февраля 2020

Вы правы. Есть ретроградный от apache poi 3.17 до apache poi 4.x. Команда разработчиков apache poi приняла решение, что ячейки формулы всегда имеют значение. См. CellBase.setCellFormula . Это может быть правильным решением.

Но вместо того, чтобы вычислить правильное значение, они установили его на 0. Но 0 является собственной ценностью. Значение 0 не может быть заполнителем для "еще не присутствует".

В apache poi 3.17 setCellFormula только установил формулу без значения. Поэтому Excel пропустил значение при разборе листа и вычислил значение по формуле. Таким образом, при создании новой рабочей книги с нуля оценка формул не требуется с использованием apache poi 3.17.

Теперь с использованием apache poi 4.x необходимо оценить все формулы. Или setForceFormulaRecalculation должно быть установлено для рабочей книги. См. Пересчет формул .

Пример:

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

class CreateExcelFormula {

 public static void main(String[] args) throws Exception {

  Workbook workbook  = new XSSFWorkbook();
  FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); // this is not necessary using apache poi 3.17

  Sheet sheet = workbook.createSheet();
  Row row = sheet.createRow(3);
  Cell cell = row.createCell(8); cell.setCellValue(21.7);
  cell = row.createCell(11); cell.setCellValue(20.0);

  cell = row.createCell(0); cell.setCellFormula("PRODUCT(I4,L4)");
  formulaEvaluator.evaluateFormulaCell(cell); // this is not necessary using apache poi 3.17

  FileOutputStream out = new FileOutputStream("Excel.xlsx");
  workbook.write(out);
  out.close();
  workbook.close();

 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...