从Excel传递数据时如何将double类型值转换为int类型?附代码
解决Excel读取时Double转Int的问题
嘿,我来帮你搞定这个从Excel读取数据时把double类型值转成int类型的问题!
首先得先指出你代码里的一个小语法错误:泛型声明那里不该加引号,应该是HashMap<String, String>而不是HashMap<"String","String">,这个得先修正,不然代码编译不过去。
接下来说说核心问题:Apache POI读取Excel的数字单元格时,不管单元格里是整数还是小数,默认都会以double类型返回值。比如Excel里写的是100,POI读出来就是100.0,直接转成String就会变成"100.0",但我们需要的是"100"这种整数形式的字符串。
我们可以通过判断单元格的类型,对数字类型的单元格做特殊处理:先检查这个double值是否是整数(比如用value % 1 == 0判断),如果是,就把它转成int再转成String;如果不是,就保留原double的字符串形式。
下面是修改后的完整代码:
import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class DataHelper { public static List<HashMap<String, String>> data(String filepath, String sheetName) { List<HashMap<String, String>> mydata = new ArrayList<>(); // 用try-with-resources自动关闭流,避免资源泄漏 try (FileInputStream fs = new FileInputStream(filepath); XSSFWorkbook workbook = new XSSFWorkbook(fs)) { Sheet sheet = workbook.getSheet(sheetName); if (sheet == null) { throw new IllegalArgumentException("工作表 " + sheetName + " 在工作簿中不存在"); } Row headerRow = sheet.getRow(0); if (headerRow == null) { throw new IllegalArgumentException("工作表中未找到表头行"); } for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { Row currentRow = sheet.getRow(i); if (currentRow == null) { continue; // 跳过空行 } HashMap<String, String> currentHash = new HashMap<>(); for (int j = 0; j < headerRow.getPhysicalNumberOfCells(); j++) { Cell headerCell = headerRow.getCell(j); String headerKey = headerCell == null ? "" : getCellValueAsString(headerCell); Cell currentCell = currentRow.getCell(j); String cellValue = getCellValueAsString(currentCell); currentHash.put(headerKey, cellValue); } mydata.add(currentHash); } } catch (Exception e) { e.printStackTrace(); // 实际项目里建议用日志框架代替printStackTrace } return mydata; } // 提取工具方法统一处理不同类型的单元格,转换为String private static String getCellValueAsString(Cell cell) { if (cell == null) { return ""; } switch (cell.getCellType()) { case STRING: return cell.getStringCellValue(); case NUMERIC: double numericValue = cell.getNumericCellValue(); // 判断是否为整数 if (numericValue == Math.floor(numericValue)) { return String.valueOf((int) numericValue); } else { return String.valueOf(numericValue); } case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); case FORMULA: // 处理公式单元格,先计算结果再转换 FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator(); CellValue cellValue = evaluator.evaluate(cell); return getCellValueAsString(cellValue); default: return ""; } } // 重载方法处理公式计算后的CellValue private static String getCellValueAsString(CellValue cellValue) { if (cellValue == null) { return ""; } switch (cellValue.getCellType()) { case STRING: return cellValue.getStringValue(); case NUMERIC: double numericValue = cellValue.getNumberValue(); if (numericValue == Math.floor(numericValue)) { return String.valueOf((int) numericValue); } else { return String.valueOf(numericValue); } case BOOLEAN: return String.valueOf(cellValue.getBooleanValue()); default: return ""; } } }
关键修改点说明:
- 修复了泛型的语法错误,符合Java规范。
- 使用
try-with-resources自动关闭文件流和Workbook,避免资源泄漏,这是Java 7+的最佳实践。 - 新增
getCellValueAsString工具方法,统一处理不同类型的单元格,核心是在数字类型判断中,将整数形式的double转成int再转String,解决100.0变成"100"的需求。 - 添加了空行、空单元格的判断,避免出现空指针异常,让代码更健壮。
- 支持公式单元格的处理,先计算公式结果再转换值。
这样修改后,当Excel里的数字是整数类型时,读取出来的String就是干净的整数形式,不会带.0后缀啦!
内容的提问来源于stack exchange,提问作者Shashank Bisht




