2017-06-05 64 views
0

在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'所示。 –

回答

1

從接口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 ))「);'而是。 –