Apache POI - CONCAT 函数未实现错误
Apache POI - Not implemented error with CONCAT function
我正在尝试编辑包含公式的 excel 文档,编辑工作正常,但公式没有更新。
我正在尝试使用以下代码来计算公式,但出现错误
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
for (Row r : sheet) {
for (Cell c : r) {
evaluator.evaluateFormulaCell(c);
}
}
Exception in thread "AWT-EventQueue-0" org.apache.poi.ss.formula.eval.NotImplementedException: Error evaluating cell Sheet1!C17
at org.apache.poi.ss.formula.WorkbookEvaluator.addExceptionInfo(WorkbookEvaluator.java:344)
at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:285)
at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:216)
at org.apache.poi.xssf.usermodel.BaseXSSFFormulaEvaluator.evaluateFormulaCellValue(BaseXSSFFormulaEvaluator.java:56)
at org.apache.poi.ss.formula.BaseFormulaEvaluator.evaluateFormulaCell(BaseFormulaEvaluator.java:185)
at Timetable.ExcelAPI.calculateFormula(ExcelAPI.java:139)
单元格 C17 具有以下公式。
=IF(C3="","",CONCAT($A17,$B17,C3,$B17,$A))
我也试过了
=IF(C3="","",CONCATENATE($A17,$B17,C3,$B17,$A))
如果我以编程方式创建公式,它会起作用
cell.setCellFormula("IF(C3=\"\",\"\",CONCAT($A17,$B17,C" + (start + 1) + ",$B17,$A))");
由于 apache poi
的 Excel
功能支持是 Excel 2007
标准,因此 CONCATENATE
已实现,但 CONCAT
未实现。此外,在 Excel 2007
之后引入的函数以 _xlfn.
.
为前缀
因此您的完整堆栈跟踪应包含:
...
Caused by: org.apache.poi.ss.formula.eval.NotImplementedFunctionException: _xlfn.CONCAT
...
解决方法是在计算之前用公式中的“CONCATENATE”替换“_xlfn.CONCAT”。
以下代码适用于我并评估 CONCATENATE
以及 CONCAT
公式。
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
class ReadExcel {
public static void main(String[] args) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream("./ExcelExampleConcatenate.xlsx"));
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
DataFormatter dataFormatter = new DataFormatter();
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
if (cell.getCellType() == CellType.FORMULA && cell.getCellFormula().contains("_xlfn.CONCAT")) {
cell.setCellFormula(cell.getCellFormula().replace("_xlfn.CONCAT", "CONCATENATE"));
}
String value = dataFormatter.formatCellValue(cell, evaluator);
System.out.println(value);
}
}
workbook.close();
}
}
通过将对函数的调用更改为简单
解决了这个问题
workbook.setForceFormulaRecalculation(true);
好消息 - 现在支持 CONCAT
功能!坏消息 - 不在您的版本中...
如果您升级(一旦可用)到 Apache POI 5.0.1 或更高版本,现在支持 CONCAT
功能,请参阅 https://bz.apache.org/bugzilla/show_bug.cgi?id=65185
如果你迫不及待想要向后移植缺失的功能,那就是http://svn.apache.org/viewvc?view=revision&revision=1887656
我正在尝试编辑包含公式的 excel 文档,编辑工作正常,但公式没有更新。
我正在尝试使用以下代码来计算公式,但出现错误
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
for (Row r : sheet) {
for (Cell c : r) {
evaluator.evaluateFormulaCell(c);
}
}
Exception in thread "AWT-EventQueue-0" org.apache.poi.ss.formula.eval.NotImplementedException: Error evaluating cell Sheet1!C17 at org.apache.poi.ss.formula.WorkbookEvaluator.addExceptionInfo(WorkbookEvaluator.java:344) at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:285) at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:216) at org.apache.poi.xssf.usermodel.BaseXSSFFormulaEvaluator.evaluateFormulaCellValue(BaseXSSFFormulaEvaluator.java:56) at org.apache.poi.ss.formula.BaseFormulaEvaluator.evaluateFormulaCell(BaseFormulaEvaluator.java:185) at Timetable.ExcelAPI.calculateFormula(ExcelAPI.java:139)
单元格 C17 具有以下公式。
=IF(C3="","",CONCAT($A17,$B17,C3,$B17,$A))
我也试过了
=IF(C3="","",CONCATENATE($A17,$B17,C3,$B17,$A))
如果我以编程方式创建公式,它会起作用
cell.setCellFormula("IF(C3=\"\",\"\",CONCAT($A17,$B17,C" + (start + 1) + ",$B17,$A))");
由于 apache poi
的 Excel
功能支持是 Excel 2007
标准,因此 CONCATENATE
已实现,但 CONCAT
未实现。此外,在 Excel 2007
之后引入的函数以 _xlfn.
.
因此您的完整堆栈跟踪应包含:
...
Caused by: org.apache.poi.ss.formula.eval.NotImplementedFunctionException: _xlfn.CONCAT
...
解决方法是在计算之前用公式中的“CONCATENATE”替换“_xlfn.CONCAT”。
以下代码适用于我并评估 CONCATENATE
以及 CONCAT
公式。
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
class ReadExcel {
public static void main(String[] args) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream("./ExcelExampleConcatenate.xlsx"));
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
DataFormatter dataFormatter = new DataFormatter();
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
if (cell.getCellType() == CellType.FORMULA && cell.getCellFormula().contains("_xlfn.CONCAT")) {
cell.setCellFormula(cell.getCellFormula().replace("_xlfn.CONCAT", "CONCATENATE"));
}
String value = dataFormatter.formatCellValue(cell, evaluator);
System.out.println(value);
}
}
workbook.close();
}
}
通过将对函数的调用更改为简单
解决了这个问题workbook.setForceFormulaRecalculation(true);
好消息 - 现在支持 CONCAT
功能!坏消息 - 不在您的版本中...
如果您升级(一旦可用)到 Apache POI 5.0.1 或更高版本,现在支持 CONCAT
功能,请参阅 https://bz.apache.org/bugzilla/show_bug.cgi?id=65185
如果你迫不及待想要向后移植缺失的功能,那就是http://svn.apache.org/viewvc?view=revision&revision=1887656