Selenium数据驱动测试中Excel整数值被读取为小数问题咨询
Apache POI读取Excel整数自动带.0后缀问题解决
核心原因
Apache POI将Excel中所有数值类型单元格(包括常规格式下输入的整数)统一识别为NUMERIC类型,底层通过double类型存储数值,如果在通用读取方法中直接将double值转为字符串返回,就会出现整数后自动拼接.0的问题。
排查步骤
- 检查通用读取方法的逻辑:确认是否未做单元格类型细分,直接调用
getNumericCellValue()后转字符串、或者直接调用cell.toString()返回结果 - 核对Excel单元格格式:确认目标整数单元格未被设置为固定保留小数位的数值格式
- 校验POI版本:排除低版本POI存在的单元格类型识别bug,推荐使用4.1.2以上稳定版本
可落地修复方案
重写通用单元格取值方法,对NUMERIC类型做细分判断,区分日期、整数、浮点数三类场景分别处理,参考代码如下:
import org.apache.poi.ss.usermodel.*; import java.text.DecimalFormat; import java.text.SimpleDateFormat; public class ExcelDataReader { private static final DecimalFormat INT_FORMAT = new DecimalFormat("0"); private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.##"); // 自动适配小数位数,末尾无意义0自动去除 private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); public static String parseCellValue(Cell cell) { if (cell == null) return ""; CellType type = cell.getCellType(); // 处理公式单元格,先取计算结果的类型 if (type == CellType.FORMULA) { type = cell.getCachedFormulaResultType(); } switch (type) { case STRING: return cell.getStringCellValue().trim(); case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { return DATE_FORMAT.format(cell.getDateCellValue()); } double numVal = cell.getNumericCellValue(); // 判定为整数的场景:数值和强转long后的值差值小于精度阈值,规避浮点计算误差 if (Math.abs(numVal - (long) numVal) < 1e-9) { return INT_FORMAT.format((long) numVal); } return DECIMAL_FORMAT.format(numVal); case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); case BLANK: return ""; default: return ""; } } }
避坑提示
禁止直接使用
cell.toString()作为通用取值逻辑,该方法返回的是POI内部调试用的原始字符串,不会做业务层面的格式适配,除了整数带.0的问题,还会出现长数值科学计数法、日期转数字串等异常。
相关场景参考截图:
内容的提问来源于stack exchange,提问作者Ujjawal
相关产品推荐
相关产品推荐




