1

我想用Java读取Excel中的数据,Excel中单元格的数据有两种类型是NUMERICSTRING。所以当我想将数据读取为 aNUMERIC时,它只显示 numbers 101125340004,而不是这样,1.01E+11因为它是一个电话属性。我的代码正在运行,但对于某些值(1%)仍然显示浮点数,但它们实际上是整数,我不知道为什么。

Excel 365 工作表中的数据 在此处输入图像描述

DataFormatter fmt = new DataFormatter();
if (cellType.toString().equals("NUMERIC"))
    companyTel = fmt.formatCellValue(currentRow.getCell(8));
else
    companyTel = currentRow.getCell(8).toString();  

输出在数据库中仍然有浮点数 在此处输入图像描述

我使用的 Java Apache POI 版本是 3.17。

请告诉我上面的代码有什么问题或者我该如何解决这个问题?谢谢你们。

4

3 回答 3

3

Microsoft Excel当使用单元格编号格式时,以科学计数法转换超过 11 位的值General。因此842223622111导致8,42224E+11Excel具有数字格式的单元格中General。如果在Excel单元格中应显示842223622111,则需要特殊的数字格式 ( 0) 而不是General.

您可以阅读Excel for Office 365 中可用的数字格式General以及大数字(12 位或更多位)格式的特殊行为。

Libreoffice/OpenOffice Calc不会这样做。842223622111留在842223622111具有数字格式的单元格中General

现在,如果 apache poi得到一个包含842223622111并具有数字格式的单元格General,那么DataFormatter也会像这样格式化它Excel

如果你想把DataFormatter它格式化得更像Libreoffice/OpenOffice Calc,那么你可以这样做:

...
DataFormatter fmt = new DataFormatter();
...
fmt.addFormat("General", new java.text.DecimalFormat("#.###############"));
...

使用这种方法,不需要对工作Excel表进行任何更改。但是当然apache poi's的默认行为DataFormatter会改变。为避免这种情况,您可以Excel使用数字格式格式化受影响的单元格0,该格式Number没有千位分隔符和小数位数 = 0。

但是由于您提到此列包含电话号码,因此最常见的解决方案是使用数字格式Text( @) 格式化整个列。这“将单元格的内容视为文本,并完全按照您键入的内容显示内容,即使您键入数字也是如此。” 因此,在应用该格式后,科学记数法将不再发生任何变化。

于 2018-08-04T08:26:36.173 回答
0

正如文件所说:

在内部,格式将使用 Format 的子类来实现,例如 DecimalFormat 和 SimpleDateFormat。因此,此类使用的格式必须遵守与这些 Format 子类相同的模式规则。这意味着只有合法的数字模式字符(“0”、“#”、“.”、“”等)可以出现在数字格式中。可以在数字模式之前或之后插入其他字符以形成前缀或后缀。

例如,Excel 模式 "$#,##0.00 "USD"_);($#,##0.00 "USD")" 将正确格式化为 "$1,000.00 USD" 或 "($1,000.00 USD)"。但是,DecimalFormat 将模式“00-00-00”错误地格式化为“000000--”。对于与 DecimalFormat 不兼容的 Excel 格式,您可以通过 DataFormatter.addFormat(String,Format) 提供自己的自定义 Format 实现。此类已提供以下自定义格式:

  • 社会保险号“000-00-0000”
  • 电话号码 ”(###) ###-####”
  • 邮编加 4“00000-0000”

您也可以像这样添加自己的格式:

DataFormatter.addFormat(String, Format)
于 2018-08-04T06:23:14.123 回答
0

试试这个它可以帮助你: -

HSSFCell cellE1 = row1.getCell((short) 4);
cellE1.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
Double e1Val = cellE1.getNumericCellValue();
BigDecimal bd = new BigDecimal(e1Val.toString());
long lonVal = bd.longValue();
System.out.println(lonVal);
于 2018-08-04T06:51:15.303 回答