Java读取Excel数值类型如何转为无科学计数法的普通字符串
问题原因
你直接调用currentCell.getNumericCellValue()获取到的是double类型的数值,当数值长度超过11位时,Java将double转为字符串时会自动使用科学计数法格式输出,就会出现你遇到的9.94775287264E11这类结果。
最优解决方案
使用Apache POI自带的DataFormatter工具类处理单元格值,它会完全按照Excel中单元格的显示格式将内容转为字符串,无需自行区分单元格类型,也不会出现科学计数法问题。
修正后的代码示例
import org.apache.poi.ss.usermodel.DataFormatter; public static Response acceptFile(File file) { // 初始化DataFormatter,全局只需要实例化一次即可 DataFormatter dataFormatter = new DataFormatter(); try { FileInputStream excelFile = new FileInputStream(file); Workbook workbook = new XSSFWorkbook(excelFile); Sheet datatypeSheet = workbook.getSheetAt(0); Iterator<Row> iterator = datatypeSheet.iterator(); // 如果Excel有表头,可加一行iterator.next()跳过第一行 while (iterator.hasNext()) { Row currentRow = iterator.next(); // 按实际列索引取对应字段,避免遍历所有单元格覆盖变量 // 假设第0列是手机号,第1列是短信内容,可根据你的实际Excel结构调整索引 String phoneNumber = dataFormatter.formatCellValue(currentRow.getCell(0)); String textMessage = dataFormatter.formatCellValue(currentRow.getCell(1)); // 每一行数据处理完直接插入数据库,避免最后只插入最后一条 insertExcellFileToDb(phoneNumber, textMessage); System.out.println(phoneNumber + " " + textMessage); } workbook.close(); excelFile.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
原有代码额外问题说明
你原有的逻辑是遍历每行的所有单元格,每次命中字符串类型就覆盖phoneNumber、命中数值类型就覆盖textMessage,最终只会保留最后一行最后一个单元格的值,且所有行处理完才调用一次插入方法,只能插入最后一条数据,上面的修正代码已经修复了这个问题。
替代方案(仅处理数值类型)
如果你不想统一用DataFormatter处理,也可以针对数值类型单独用BigDecimal转换:
else if (currentCell.getCellTypeEnum() == CellType.NUMERIC) { BigDecimal bd = BigDecimal.valueOf(currentCell.getNumericCellValue()); // toPlainString()会输出无科学计数法的字符串 textMessage = bd.toPlainString(); }
这个方案适合明确知道单元格是整数数值的场景,如果Excel中该列有自定义格式(比如带千分位、日期格式等),还是优先用DataFormatter方案。
内容的提问来源于stack exchange,提问作者iwritecomeinmymind
相关产品推荐
相关产品推荐

