POI-XSSF:从公式单元格缓存值中读取格式化值

时间:2016-07-04 10:32:58

标签: java excel apache-poi xssf

在我的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));

这适用于常规单元格,但对于具有公式的单元格,这实际上会获取公式字符串并显示它,即它不会获取缓存值并对其进行格式化,而只是返回公式字符串。

有没有办法在从CELL_TYPE_FORMULA

中检索值后格式化值

2 个答案:

答案 0 :(得分:3)

如果你在FormulaEvaluator的电话中传入formatCellValue,即

,它应该有用。
DataFormatter formatter = new DataFormatter();
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
System.out.print(formatter.formatCellValue(cell, evaluator));

答案 1 :(得分:3)

可以在不使用评估程序的情况下直接格式化单元格的缓存值。在由于第三方插件或单元格公式中不可用的外部数据而无法重新计算的值时,它非常有用。

此代码可用于执行此操作:

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以手动格式化单元格缓存值及其样式。