如何在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
答
从接口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 ))“);'而是。 –
过人之处[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'所示。 –