我想用Java在Excel中读取数据,Excel中的单元格数据有两种类型:NUMERIC
和STRING
。因此,当我想以NUMERIC
的形式读取数据时,它仅显示数字101125340004
,而不像1.01E+11
那样显示数字,因为它是电话属性。我的代码可以正常工作,但是对于某些值(1%)仍显示浮点数,但它们实际上是整数,我不知道为什么。
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。
请告诉我上面代码中的错误或如何解决该问题?谢谢大家。
答案 0 :(得分:2)
Microsoft Excel
在使用单元格编号格式General
时以科学计数形式转换11位以上的值。因此,842223622111
在8,42224E+11
单元格中以数字格式Excel
导致General
。如果在Excel
中该单元格应显示842223622111
,则需要一种特殊的数字格式(0
)来代替General
。
您可以了解available number formats in Excel for Office 365和General
格式对大数字(12位或更多数字)的特殊行为。
Libreoffice/OpenOffice Calc
不会这样做。在数字格式为842223622111
的像元中,842223622111
停留在General
中。
现在,如果apache poi
获得了一个包含842223622111
并具有数字格式General
的单元格,那么DataFormatter
将像Excel
一样格式化。< / p>
如果您希望DataFormatter
的格式应更像Libreoffice/OpenOffice Calc
,则可以执行以下操作:
...
DataFormatter fmt = new DataFormatter();
...
fmt.addFormat("General", new java.text.DecimalFormat("#.###############"));
...
使用这种方法,Excel
工作表中无需进行任何更改。但是当然可以更改apache poi
的{{1}}的默认行为。为避免这种情况,您可以使用数字格式DataFormatter
将受影响的单元格设置为Excel
,数字格式为0
,不带千位分隔符,十进制小数位数= 0。
但是由于您提到此列包含电话号码,所以最常见的解决方案是使用数字格式Number
(Text
)格式化整个列。这“将单元格的内容作为文本进行处理,并且即使键入数字,也完全按照您键入的内容显示内容”。因此,在应用格式之后,就不会再更改为科学计数法了。
答案 1 :(得分:0)
在内部,将使用Format的子类来实现格式 例如DecimalFormat和SimpleDateFormat。因此使用的格式 该类必须遵循与这些Format相同的模式规则 子类。这意味着只有合法的数字模式字符(“ 0”, “#”,“。”,“。”等可能以数字格式出现。其他字符可以 在数字模式之前或之后插入以形成前缀或 后缀。
例如Excel模式“ $#,## 0.00” USD“ _);($#,## 0.00” USD“)” 的格式将正确设置为“ $ 1,000.00 USD”或“(($ 1,000.00 USD)””。 但是,模式“ 00-00-00”的格式不正确 DecimalFormat为“ 000000--”。对于不兼容的Excel格式 使用DecimalFormat,您可以提供自己的自定义格式 通过DataFormatter.addFormat(String,Format)实现。的 此类已经提供了以下自定义格式:
- SSN“ 000-00-0000”
- 电话号码“(###)###-####”
- 邮政编码加4个“ 00000-0000”
您还可以添加自己的格式,如下所示:
DataFormatter.addFormat(String, Format)
答案 2 :(得分: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);