如何使用 Apache POI 在单元格中设置公式?

问题描述 投票:0回答:8

我目前正在使用 Apache POI for Java 在单元格中设置公式。

但是在我运行程序并打开我创建和处理的 Excel 文件后,包含公式的单元格将公式作为字符串包含在内,而不是公式应返回的值。

java apache-poi
8个回答
60
投票

HSSFCell
对象具有方法
.setCellType
.setCellFormula
,您需要像这样调用:

// "cell" object previously created or looked up
String strFormula= "SUM(A1:A10)";
cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
cell.setCellFormula(strFormula);

20
投票

单元常数已弃用,将从 4.0 版本中删除 而不是使用细胞

细胞类型.公式

String formula= "SUM(B4:B20)";
cell.setCellType(CellType.FORMULA);
cell.setCellFormula(formula); 

更新

setCellType() :基于@fenix 评论。此方法已弃用,并将在 POI 5.0 中删除。使用显式的 setCellFormula(String)、setCellValue(...) 或 setBlank() 来获得所需的结果。

String formula= "SUM(B4:B20)";
cell.setCellFormula(formula);

13
投票

下面的代码对我来说效果很好,希望这对某人有用。

cell.setCellType(Cell.CELL_TYPE_FORMULA);
cell.setCellFormula("SUM(C70:C76)");

7
投票

Apache POI 不支持用户自定义函数。

来自文档

请注意,不支持用户定义的函数,并且不太可能 很快就能完成...至少在有 VB 之前不会 用Java实现!


6
投票

您可以用它来计算工作簿中的公式:

        // Evaluate all formulas in the sheet, to update their value
    FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
    formulaEvaluator.evaluateAll();

4
投票

我遇到了类似的问题,并且

"SUM(B4:B20)"
不能直接为我工作,因为工作表是动态生成的。问题出在单元格引用上。

基于https://stackoverflow.com/a/2339262/2437655https://stackoverflow.com/a/33098060/2437655我能够生成实际的公式。例如

 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})"

希望有帮助。


1
投票

这是一种建议的方法:

Workbook workbook1 = new SXSSFWorkbook(-1);
Sheet newSheet = workbook1.createSheet("Valuations");
Row newRow = newSheet.createRow(i-1);
newRow.createCell(L++).setCellFormula("AVERAGE(" + "E" + i + ":" + "G" + i + ")");

其中 E 和 G 是 A1,B1,C1....E1...G1 等列
i 代表上列中的数字。

L++ 只是一个增量计数器。


0
投票

而不是只设置这样的公式:

cell.setCellFormula(strFormula);

您还应该评估这个single单元格(-不需要像 Diogo Vilela 写的那样“formulaEvaluator.evaluateAll()”。)

FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
formulaEvaluator.evaluateFormulaCell(cell);

这是必要的,如果您稍后执行“sheet.autoSizeColumn(...)”。

© www.soinside.com 2019 - 2024. All rights reserved.