Apache POI:如何格式化数字单元格值

3

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

XLS 表格中有一列数值,例如 "3000053406"。

当我使用 POI 读取时...

cell.getNumericCellValue()

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

当使用Apcahe POI读取数据时,我该如何设置数字格式?

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

4个回答

2

这个问题经常出现...

选择我以前回答的一个几乎相同的问题

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

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


谢谢您的回复。我对在DataFormatter类中如何设置格式有些困惑。根据我的理解,我只需要结果中的数字,不需要小数精度,所以我需要将格式设置为########。我是对的吗?请确认一下。 - Gunjan Shah
请提供一些小的存根以便更好地理解。我尝试使用DataFormatter,但是我不知道如何在DataFormatter类中设置格式。这里我正在使用xls和xlsx格式,所以需要使用HSSFDataFormatter吗?cellStyle.setDataFotmat(short)要求短值。我该如何检索该短值? - Gunjan Shah
您不需要设置任何内容 - 它会获取应用于Excel单元格的格式化规则,并使用这些规则来格式化数字。 - Gagravarr
@Gagravarr,您能否提供一个简单的示例,其中“它获取了在Excel中应用于单元格的格式规则”? - Bnrdo
@onepotato 试一下吧!或者查看源代码以查看……如果它不能正常工作,您需要提出一个新的问题。 - Gagravarr

1
问题可能严格与Java相关,而不是与POI相关。由于您的调用返回一个双精度值,
double val = cell.getNumericCellValue();
您可能希望获得这个值
DecimalFormat df = new DecimalFormat("#"); int fractionalDigits = 2; //假设是2 df.setMaximumFractionDigits(fractionalDigits); double val = df.format(val);

0

通过使用数值单元格中的双精度值创建一个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());

-2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接