Как установить формулы в ячейках, используя Apache POI? - PullRequest
35 голосов
/ 26 февраля 2010

В настоящее время я использую Apache POI для Java для установки формул в ячейках.

Но после запуска программы и открытия файла Excel, который я создал и обработал, ячейки с формулой содержат формулу в виде строки, а не значение, которое формула должна была вернуть.

Ответы [ 6 ]

48 голосов
/ 26 февраля 2010

Объект HSSFCell имеет методы .setCellType и .setCellFormula, которые нужно вызывать так:

// "cell" object previously created or looked up
String strFormula= "SUM(A1:A10)";
cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
cell.setCellFormula(strFormula);
12 голосов
/ 18 февраля 2013

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

cell.setCellType(Cell.CELL_TYPE_FORMULA);
cell.setCellFormula("SUM(C70:C76)");
10 голосов
/ 26 апреля 2017

Константы ячеек устарели и будут удалены из версии 4.0 вместо ячейки используйте

CellType.FORMULA

String formula= "SUM(B4:B20)";
cell.setCellType(CellType.FORMULA);
cell.setCellFormula(formula);
7 голосов
/ 26 ноября 2012

Apache POI не поддерживает пользовательские функции.

Из документации :

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

4 голосов
/ 13 августа 2018

Вы можете использовать это для оценки формул в рабочей книге:

        // Evaluate all formulas in the sheet, to update their value
    FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
    formulaEvaluator.evaluateAll();
1 голос
/ 17 июня 2018

У меня была похожая проблема, и "SUM(B4:B20)" не работает для меня напрямую, поскольку лист генерировался динамически Проблема была с ссылкой на ячейку.

На основе https://stackoverflow.com/a/2339262/2437655 и https://stackoverflow.com/a/33098060/2437655 мне удалось создать фактическую формулу например, * +1008 *

 val totalProductQtyPerUserCell = userDetailsRow.createCell(products.size + 1)
 totalProductQtyPerUserCell.cellType = HSSFCell.CELL_TYPE_FORMULA
 totalProductQtyPerUserCell.cellFormula = "SUM(${CellReference.convertNumToColString(1)}${totalProductQtyPerUserCell.row.rowNum + 1}:${CellReference.convertNumToColString(products.size)}${totalProductQtyPerUserCell.row.rowNum + 1})"

Надеюсь, что поможет.

...