使用Apache POI读取Excel手机号时遇类型异常如何正确获取号码?
解决Apache POI读取Excel手机号的问题
这个问题我之前也碰到过,咱们一步步拆解原因和解决方案:
问题根源
- int溢出:11位手机号(比如8902305623)远大于int类型的最大值
2147483647,直接强转(int) cell.getNumericCellValue()必然会溢出,得到错误的数值。 - 科学计数法问题:
getNumericCellValue()返回的是double类型,当数字长度超过一定范围时,会自动转成科学计数法(比如8.902305623E9),这显然不是我们想要的手机号格式。 - IllegalStateException异常:这个异常是因为你后续可能尝试调用
getStringCellValue()去读取一个数值类型的单元格,POI不允许直接从数值单元格获取字符串值,必须先做类型处理。
正确的解决方案
推荐用BigDecimal来处理数值型手机号,它能精准表示大整数,还能避免科学计数法的问题,代码示例如下:
// 先判断单元格类型,兼容不同格式的手机号 if (cell.getCellType() == CellType.NUMERIC) { // 用BigDecimal获取精准数值,转成不带科学计数法的字符串 String phoneNumber = new BigDecimal(cell.getNumericCellValue()).toPlainString(); sel.setContactno(phoneNumber); System.out.println("----------->" + phoneNumber); } else if (cell.getCellType() == CellType.STRING) { // 处理本来就是字符串类型的手机号 sel.setContactno(cell.getStringCellValue()); }
如果你确定单元格里的数值都是手机号(不会有小数),也可以先将单元格类型转为字符串再读取,但这种方式会修改单元格的原始类型,谨慎使用:
if (cell.getCellType() == CellType.NUMERIC) { // 将数值单元格转为字符串类型 cell.setCellType(CellType.STRING); String phoneNumber = cell.getStringCellValue(); sel.setContactno(phoneNumber); }
额外建议
最好在导入Excel的时候,就把手机号列的格式设置为文本类型,这样读取的时候直接用getStringCellValue()就能拿到正确的手机号,避免后续的类型转换问题。
内容的提问来源于stack exchange,提问作者Subrata Das
相关产品推荐
相关产品推荐

