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

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的问题,还会出现长数值科学计数法、日期转数字串等异常。

相关场景参考截图:

  • Excel源数据
  • 原有读取方法代码
  • 测试用例异常表现

内容的提问来源于stack exchange,提问作者Ujjawal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:54:27