【问题标题】:Apache POI : How to format numeric cell valuesApache POI:如何格式化数字单元格值
【发布时间】:2020-04-29 22:15:24
【问题描述】:

我正在使用 Apache POI 3.9 进行 XLS/XLSX 文件处理。

在 XLS 工作表中,有一列数值类似于“3000053406”。

当我用 POI 阅读它时......

cell.getNumericCellValue()

它给了我像“3.00E+08”这样的价值。这在我的应用程序中造成了巨大的问题。

在 Apcahe POI 中读取数据时如何设置数字格式?

我知道有一种方法是将列设置为“文本”类型。但我想知道在读取数据时 Apache POI 端是否还有其他方法。或者我们可以使用简单的 java DecimalFormatter 对其进行格式化吗?

【问题讨论】:

    标签: apache-poi


    【解决方案1】:

    这个经常出现....

    采摘one of my past answers to an almost identical question

    您想要做的是使用DataFormatter class。您将此单元格传递给它,它会尽力返回一个字符串,其中包含 Excel 会为您显示该单元格的内容。如果你给它传递一个字符串单元格,你会得到这个字符串。如果您向它传递一个应用了格式规则的数字单元格,它将根据它们格式化数字并返回字符串。

    对于您的情况,我假设数字单元格应用了整数格式规则。如果您要求 DataFormatter 格式化这些单元格,它会返回一个包含整数字符串的字符串。

    【讨论】:

    • 感谢您的回复。在这里,我对如何在 DataFormatter 类中设置格式有点困惑。据我了解,我只想要没有浮点精度的resule中的数字,所以我需要将格式设置为########。我对吗 ? ..请确认
    • 您能否提供一些小存根以便更好地理解。我尝试使用 DataFormatter 但我不明白如何在 DataFormatter 类中设置格式。这里我使用的是 xls 和 xlsx 格式,所以.. 需要使用 HSSFDataFormatter 吗?并且 cellStyle.setDataFotmat(short) 要求短值。我怎样才能找回那个短值?
    • 您不需要设置任何内容 - 它会获取在 Excel 中应用于单元格的格式规则,并使用这些规则来格式化数字
    • @Gagravarr 你能提供一个简单的例子,“它获取在 Excel 中应用到单元格的格式规则”吗?
    • @onepotato 试试看!或者查看源代码以查看...如果它不能正常工作,您需要提出一个新问题
    【解决方案2】:

    问题可能与 Java 严格相关,也与 POI 无关。 由于您的调用返回双精度,

    double val = cell.getNumericCellValue();

    你可能想得到这个

    DecimalFormat df = new DecimalFormat("#"); int fractionalDigits = 2; // say 2 df.setMaximumFractionDigits(fractionalDigits); double val = df.format(val);

    【讨论】:

      【解决方案3】:

      使用数字单元格中的双精度值创建 BigDecimal,然后使用

      BigDecimal.toPlainString()

      函数将其转换为纯字符串,然后在擦除值后将其存储回同一单元格,从而解决了数值的指数表示的整个问题。

      下面的代码为我解决了这个问题。

          Double dnum = cellContent.getNumericCellValue();
          BigDecimal bd = new BigDecimal(dnum);
          System.out.println(bd.toPlainString());
          cellContent.setBlank();
          cellContent.setCellValue(bd.toPlainString());
          System.out.println(cellContent.getStringCellValue());
      

      【讨论】:

        【解决方案4】:

        long varA = new Double(cellB1.getNumericCellValue()).longValue(); 这将带来变量varA 中的确切值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多