【问题标题】:POI-XSSF: read formatted value from formula cells cached valuePOI-XSSF:从公式单元格缓存值中读取格式化值
【发布时间】:2016-07-04 10:32:57
【问题描述】:

在我的 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 中检索一个值后对其进行格式化

【问题讨论】:

    标签: java excel apache-poi xssf


    【解决方案1】:

    可以直接格式化单元格的缓存值,而无需使用求值器。这对于由于第三方插件或单元格公式中的外部数据不可用而无法重新计算的值非常有用。

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

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

    【讨论】:

      【解决方案2】:

      如果您在对formatCellValue 的调用中传入FormulaEvaluator,它应该可以工作,即

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

      【讨论】:

      • 实际上公式来自第三方插件,我不会使用,我只需要正确格式化缓存的值
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多