如何在apache poi中评估这个公式?

问题描述:

在Microsoft Office Excel中,我将此公式设置在单元格中。 =YEAR("2017-01-01")。结果是2017
在apache-poi中,我也这样做。如何在apache poi中评估这个公式?

cell.setCellFormula("YEAR(\"2017-01-01\")"); 

但是我得到了一个错误的结果。

#VALUE! 

如何获得正确的结果?

代码

HSSFWorkbook hssfworkbook = new HSSFWorkbook(); 
HSSFSheet sheet = hssfworkbook.createSheet("Sheet1"); 
HSSFRow row = sheet.createRow(0); 
HSSFCell cell = row.createCell(0); 
cell.setCellFormula("YEAR(\"2017-01-01\")"); 
CreationHelper creationHelper = hssfworkbook.getCreationHelper(); 
FormulaEvaluator evaluator = creationHelper.createFormulaEvaluator(); 
System.out.println(evaluator.evaluate(cell)); 

控制台

org.apache.poi.ss.usermodel.CellValue [#VALUE!] 

使用Apache-POI 3.16

+0

过人之处[YEAR函数(https://support.office.com/en-us/article/YEAR- function-c64f017a-1354-490d-981f-578e8ec8d3b9)期望'Serial_number'作为它的参数而不是'String'。也许Excel本身会很宽容,并在“Year”中使用之前将“2017-01-01”转换为日期序列号。但'apache poi'不会这样做。所以'cell.setCellFormula(“YEAR(DATE(2017,1,1))”);'如Excels帮助文件中的'Year'所示。 –

从接口FormulaEvaluator文档

如果单元格中包含的式,则计算式,并放置e公式结果返回到单元格中,而不是旧的公式。否则,如果细胞不含配方,该方法会使细胞不变。需要注意的是小区的同一个实例返回到允许链式调用,如:

int evaluatedCellType = evaluator.evaluateInCell(cell).getCellType(); 
if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) 
{ 
    cell = evaluator.evaluateInCell(cell); 
} 
+0

这并没有帮助。我认为apache poi不能支持像@Axel Richter说的那样将'string'转换为'date serial_number'。我决定使用'cell.setCellFormula(“YEAR(DATE(2017,1,1 ))“);'而是。 –