POI-XSSF:从公式单元格caching值中读取格式化的值

在我的Excel表中,许多单元格都包含公式,我不想在使用Apache POI读取excel时重新计算这些公式。

我这样做的方式:

if(cell.getCellType() == XSSFCell.CELL_TYPE_FORMULA) { //System.out.println("Formula is " + cell.getCellFormula()); switch(cell.getCachedFormulaResultType()) { case XSSFCell.CELL_TYPE_NUMERIC: System.out.print(cell.getNumericCellValue() +" "); break; case XSSFCell.CELL_TYPE_STRING: System.out.print(cell.getRichStringCellValue()+" "); break; } } 

这有助于我获得细胞的原始价值。 例如,如果单元格的值为19.5%,则会给我0.195456。 我想获得格式化的值。

一种获得格式化值的方法是:

 DataFormatter formatter = new DataFormatter(); System.out.print(formatter.formatCellValue(cell)); 

这适用于普通的单元格,但对于具有公式的单元格,这实际上是获取公式string并显示它,即它不会获取caching的值并对其进行格式化,而只是返回公式string。

有没有办法从CELL_TYPE_FORMULA中检索后格式化一个值

如果你在调用formatCellValue传递一个FormulaEvaluator的话,它应该可以工作

 DataFormatter formatter = new DataFormatter(); FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); System.out.print(formatter.formatCellValue(cell, evaluator)); 

可以直接格式化单元格的caching值,而无需使用评估程序。 这对于由于单元格公式中的第三方插件或不可用的外部数据而无法重新计算的值很有用。

这个代码可以用来做到这一点:

 final DataFormatter dataFormatter = new DataFormatter(); final CellStyle cellStyle = cell.getCellStyle(); final String formtatedValue = dataFormatter.formatRawCellContents(cell.getNumericCellValue(), cellStyle.getDataFormat(), cellStyle.getDataFormatString()); System.out.println(formattedValue); 

格式化程序仍在使用,但formatRawCellContents方法被调用以手动格式化单元格caching值的样式。