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 poiExcel 功能支持是 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