【分享-POI工具,Excel字段取值容错小工具】

在使用POI导出Excel数据的时候这样

java 复制代码
         FileInputStream inputStream = new FileInputStream(file);
        Workbook workbook = WorkbookFactory.create(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        for (Row row : sheet) {
			row.getCell(1).getStringCellValue();
			......
		}

row.getCell(1).getStringCellValue(); 这里是很容易报错的. 因为excel里的列格式即使设置为文本

当cell内的值是一个纯数字的时候, POI取到的还会是一个double类型的值. getStringCellValue(这个方法就会抛出类型不匹配的错误.)

为了解决这个常见问题. 写了这个工具类

java 复制代码
public class ExcelUtil {
    public static String getCellValueString(Cell cell){
        if (cell != null) {
            switch (cell.getCellType()) {
                case STRING:
                    // 如果单元格内容是字符串类型
                    return cell.getStringCellValue();
                case NUMERIC:
                    // 如果单元格内容是数字类型
                    double numericValue = cell.getNumericCellValue();
                    return String.valueOf(numericValue); // 转为字符串后设置
                case BOOLEAN:
                    // 如果单元格内容是布尔值类型
                    boolean booleanValue = cell.getBooleanCellValue();
                    return String.valueOf(booleanValue); // 转为字符串后设置
                case FORMULA:
                    // 如果单元格是公式
                    String formulaValue = cell.getCellFormula();
                    return formulaValue; // 设置公式字符串
                default:
                    // 其他类型的处理(如空单元格)
                    return ""; // 设置为空字符串
            }
        } else {
            // 如果单元格为空
            return ""; // 设置为空字符串
        }

    }

    public static double getCellValueNumber(Cell cell){
        if (cell == null) {
            return -4; // 如果单元格为空,返回-1
        }
        switch (cell.getCellType()) {
            case STRING:
                try {
                    // 尝试将字符串转换为数字
                    return Double.parseDouble(cell.getStringCellValue());
                } catch (NumberFormatException e) {
                    // 如果字符串不能转换为数字,返回-1
                    return -1;
                }

            case NUMERIC:
                // 如果是数字类型,直接返回数字
                return cell.getNumericCellValue();

            case BOOLEAN:
                // 如果是布尔类型,true转换为1,false转换为0
                return cell.getBooleanCellValue() ? 1 : 0;

            case FORMULA:
                // 如果是公式类型,返回-1
                return -2;

            default:
                // 对于其他类型,返回-1
                return -3;
        }
    }
}

然后我们必须要从cell中取String类型就这样使用

java 复制代码
ExcelUtil.getCellValueString(row.getCell(2));

取double类型就这样使用

java 复制代码
ExcelUtil.getCellValueNumber(row.getCell(3));

避免excel总是自动转换或者用户输入错误造成的导入数据错误.

相关推荐
967726 分钟前
理解IOC控制反转和spring容器,@Autowired的参数的作用
java·sql·spring
SY_FC26 分钟前
实现一个父组件引入了子组件,跳转到其他页面,其他页面返回回来重新加载子组件函数
java·前端·javascript
耀耀_很无聊1 小时前
09_Jenkins安装JDK环境
java·运维·jenkins
ノBye~1 小时前
Centos7.6 Docker安装redis(带密码 + 持久化)
java·redis·docker
黑臂麒麟1 小时前
openYuanrong:多语言运行时独立部署以库集成简化 Serverless 架构 & 拓扑感知调度:提升函数运行时性能
java·架构·serverless·openyuanrong
XiaoLeisj1 小时前
Android Jetpack 页面架构实战:从 LiveData、ViewModel 到 DataBinding 的生命周期管理与数据绑定
android·java·架构·android jetpack·livedata·viewmodel·databinding
⑩-1 小时前
为什么要用消息队列?使用场景?
java·rabbitmq
似水明俊德1 小时前
01-C#.Net-泛型-面试题
java·开发语言·面试·c#·.net
Allnadyy2 小时前
【C++项目】从零实现高并发内存池(一):核心原理与设计思路
java·开发语言·jvm
浑水摸鱼仙君2 小时前
SpringSecurity和Flux同时使用报未认证问题
java·ai·flux·springsecurity·springai