You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Apache POI读取Excel手机号时遇类型异常如何正确获取号码?

解决Apache POI读取Excel手机号的问题

这个问题我之前也碰到过,咱们一步步拆解原因和解决方案:

问题根源

  1. int溢出:11位手机号(比如8902305623)远大于int类型的最大值2147483647,直接强转(int) cell.getNumericCellValue()必然会溢出,得到错误的数值。
  2. 科学计数法问题:getNumericCellValue()返回的是double类型,当数字长度超过一定范围时,会自动转成科学计数法(比如8.902305623E9),这显然不是我们想要的手机号格式。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:58:17