使用EasyPoi实现批量导入并处理重复数据

本文介绍如何使用EasyPOI实现Excel数据的批量导入功能,包括业务校验、避免重复导入及失败数据反馈等关键步骤。

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

1.功能实现:把excel表格的数据导入数据库,对于数据库有的数据,跳过不导入,不重复的数据插入数据库。对于业务校验、重复的数据在导入后返回一个excel表格,全部正常导入返回200

2.技术实现:EasyPOi、异步化

 

一、maven配置

        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>3.3.0</version>
        </dependency>

二、实现

1.excel对应的实体类,并做相应的业务校验。实体类实现IExcelDataModel, IExcelModel这两个接口

2.导入实现

1)contorller层

service层省略

最重要的实现类 Impl

ImportParams params = new ImportParams();
        params.setTitleRows(1);
        params.setHeadRows(1);
        params.setStartRows(2);
        params.setNeedVerfiy(true);
        params.setVerifyHandler(pmsBunkImportHandler);
        ExcelImportResult<PmsMallBunkImportMapDTO> result=null;
        try {
            result = ExcelImportUtil.importExcelMore(file.getInputStream(), PmsMallBunkImportMapDTO.class, params);
        } catch (Exception e) {
            e.printStackTrace();
        }
        List<PmsMallBunkImportMapDTO> list = result.getList();

        List<PmsMallBunk> pmsMallBunks = pmsMallBunkMapper.selectAllBunkCode();
        List<String> collectCodes = pmsMallBunks.stream().map(PmsMallBunk::getBunkCode).collect(Collectors.toList());
        //入库
        for (PmsMallBunkImportMapDTO mallBunkImportMapDTO:list){
            String bunkCode = String.format(mallBunkImportMapDTO.getMallName() + mallBunkImportMapDTO.getFloorNo() + mallBunkImportMapDTO.getAreaCode() + mallBunkImportMapDTO.getBunkCategory() + "-" + mallBunkImportMapDTO.getStallCode());
            if (collectCodes.contains(bunkCode)){
                continue;
            }
            pmsBunkExcelImportTask.asyncExcelImport(mallBunkImportMapDTO,bunkCode);
        }
        List<PmsMallBunkImportMapDTO> failList = result.getFailList();
        //验证是否有失败的数据
        String fileName="导入失败的信息";
        if (result.isVerfiyFail()) {
            ServletOutputStream fos = resp.getOutputStream();
            //mime类型
            resp.setCharacterEncoding("UTF-8");
            resp.setHeader("content-type", "application/octet-stream;charset=UTF-8");
            resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls");
            resp.setContentType("application/octet-stream;charset=UTF-8");
            result.getFailWorkbook().write(fos);
            fos.close();
        }

 2)excel业务校验handler类,实现 IExcelVerifyHandler接口

3.为了提交插入的效率,使用线程池异步插入数据库,具体参考spring+线程池相关文章。

Impl实现类中的 pmsBunkExcelImportTask.asyncExcelImport(mallBunkImportMapDTO,bunkCode)方法

 线程池相关配置

3.测试

excel的数据如下

初次导入成功!

再次导入!出现Download file表示有错误的数据!点击下载

打开后如下,其他校验也是同样效果,至此完成批量导入excel的功能

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值