基于Poi的自编导入工具类

本文介绍了一款使用Poi和反射技术开发的Excel数据导入工具,通过自定义注解进行字段验证,并重点讲解了如何接收Excel数据实体类、业务层的简单使用方法及版本迭代过程。工具逐步优化,去除冗余功能,提升易用性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 使用技术:

2. 组成

 3. 简单使用说明

(1)接收Excel数据实体类

(2)业务层

(3)Excel样式:

4.版本迭代


这篇是简单使用,等有时间再整理总结,等后续

* GitHub地址:https://github.com/BadGuy-Darren/MyExcelImportTool.git

1. 使用技术:

基于Poi、反射

2. 组成

组成分为自定义注解包、枚举包、异常包,以及主要实现类

 3. 简单使用说明

(1)接收Excel数据实体类

@Data
public class ObjectDTO {
    // 要求非空
    @NotNull(message = "param不能为空!")
    private String param;
    // 约束日期格式
    @ExcelDateFormat(pattern = "yyyy/MM/dd", message = "日期格式不正确!")
    private String dateTime;
    // 限定值范围
    @ValueLimit(limit = {"数值", "文字"}, message = "类型只能选填数值、文字!")
    private String type;
    // 当type等于“数值”时,对参数进行数值格式限定
    @ExcelNumberFormat(when = "type == 数值", format = "#.##", message = "类型为数值时,minValue为非空数字!")
    private String minValue;
    // format默认为“#.##”
    @ExcelNumberFormat(when = "type == 数值", message = "类型为数值时,maxValue为非空数字!")
    private String maxValue;
}

 注解有相关说明

 注解校验借鉴javax的Validation,在参数验证不通过时会抛出IllegalArgumentException,异常message格式如下:

文件工作表n第a行第b列:日期格式不正确

后续根据业务需要可以继续拓展自定义注解。

(2)业务层

    public String excelImport(MultipartFile file) throws IOException, IllegalStatementsException {
        GetExcelUtil4 getExcelUtil = new GetExcelUtil4();

        /*
           初始化工具类
           参数:文件、要读取的sheet数
         */
        getExcelUtil.initialize(file, 2)
                // sheet需以“start.”批注标注起始行,默认不使用
                .setStartTag("start.")
                // sheet需以“end.”做结束行第一个值,默认不使用(默认读取到全空行结束)
                .setEndTag("end.");

        // 获取第一个sheet的名称
        String sheetName = getExcelUtil.getSheetName(1);

        /*
            1. 以实体类ObjectDTO接收数据
            2. 参数分别为:
                (1)要读取的sheet下标,以1开始
                (2)起始行号,按excel实际行号
                (3)起始列数,按excel实际列号,转数字
                (4)每行要读取的cell个数
                (5)返回数据集类型
            3. getHorizontalData方法为获取数据横向分布,纵向拓展的sheet数值
         */
        List<ObjectDTO> ObjectList1 = getExcelUtil.getHorizontalData(1, 2, 1, 5, ObjectDTO.class);
        System.out.println(ObjectList1.toString());
        
        /*
            同上,但:
                getVerticalData方法为获取数据纵向分布,横向拓展的sheet数值
                且第(4)点应该为“每列要读取的cell个数”
         */
        List<ObjectDTO> ObjectList2 = getExcelUtil.getVerticalData(2, 1, 2, 5, ObjectDTO.class);
        System.out.println(ObjectList2.toString());

        return "success";
    }

文件初始化一次后可以进行多次读取。

(3)Excel样式:

 

 实现层就暂时先不展示了。

4.版本迭代

工具前前后后更新过四版。

第一版是使用List<List<Object>>读取数据,读取数据灵活性特别高。但是在读取模板数据的过程中,不支持数据格式约束等防呆,在读取完数据后还需要对数据进行二次遍历处理才能取到理想数据,业务层还需要大篇幅的数据处理代码(格式约束、数据防呆等)。

第二版开始尝试使用List<DTO>读取数据,通过泛型传递实体类型。通过反射,结合多个条件判断分支,根据DTO中字段注解在工具中做相应的数据防呆与格式处理。该版保留List<List<Object>>读取数据的功能。工具类实际应用效果不错,但功能较为单一,还有很多不严谨的编码

第三版因在实际应用中出现了更为复杂的业务需求(数据模板数据错落分布,横纵格式交错),于是增加了数据多层嵌套功能,并把能想到的所有可能出现的业务场景都考虑了进去。结果犯了过度设计的错误。完成后的第三版繁琐臃肿,类内部方法之间代码耦合特别严重(多层嵌套的后果)可维护性低,且多层嵌套功能大多数普通场景应用不到

第四版在观察(同事使用该功能的频率)思辨许久之后最终决定移除该功能,从轻重构代码,得到了现在的第四版。第四版移除多层嵌套。移除List<List<Object>>数据读取功能,仅保留实体类数据读取功能。新增支持一次初始化多次取获取数据功能。多层嵌套功能可以通过获取数据次数的累加,加上业务逻辑的辅助,可以一定程度上实现第三版的数据实体类的多层嵌套功能,目前也够用了。其他更新等遇到了相应的特殊场景再做功能补充。切忌过度设计

后续将持续维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大迪吃小迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值