EasyExcel导入

1.业务代码

//EasyExcel.read(文件输入流, 实体类对象,监听器).sheet().doRead();
import com.alibaba.excel.EasyExcel;


public void addFile(MultipartFile file) throws Exception {
EasyExcel.read(file.getInputStream(), Test.class,new ExcelImportTest(service)).sheet().doRead();
}

2.实体类代码

@Data
public class Test implements Serializable {

    /**
     * 姓名
     */
    @ExcelProperty(value = "姓名", index = 0)
    private String name;

    /**
     * 性别:0-女 1-男 2-其他
     */
    @ExcelProperty(value = "性别", index = 1)
    private String sex;

    /**
     * 年龄
     */
    @ExcelProperty(value = "年龄", index = 2)
    private String age;
}

3.监听器

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.xlkj.base.ex.BizException;
import com.xlkj.dao.domain.dto.HjCustomerImportDTO;
import com.xlkj.service.service.call.HjCustomerService;
import com.xlkj.system.response.LoginUserRpcResponse;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

@Slf4j
public class ExcelImportTest extends AnalysisEventListener {
    /**
     * 每次读取的最大数据条数
     */
    private static final int MAX_BATCH_COUNT = 10;

    /**
     * 泛型bean属性
     */
    private TestService service;


    /**
     * 可接收任何参数的泛型List集合
     */
    List<Test> testDTOS = new ArrayList<>();


    /**
     * 构造函数注入bean(根据传入的bean动态注入)
     */
    public ExcelImportTest(TestService service) {
        this.service = service;
    }

    /**
     * 解析每条数据都进行调用
     *
     * @param data
     * @param context
     */
    @Override
    public void invoke(Object data, AnalysisContext context) {
        log.info(" ==> 解析一条数据: {}", data);
        testDTOS.add((Test) data);
        if (testDTOS.size() > MAX_BATCH_COUNT) {
            // 保存数据
            saveData();
            // 清空list
            testDTOS.clear();
        }
    }


    /**
     * 所有数据解析完成后,会来调用一次
     * 作用: 避免最后集合中小于 MAX_BATCH_COUNT 条的数据没有被保存
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData();
        log.info(" ==> 数据解析完成 <==");
    }

    /**
     * 保存数据: 正式应该插入数据库,这里用于测试
     */
    private void saveData() {
        log.info(" ==> 数据保存开始: {}", testDTOS.size());
        service.saveImportDTO(testDTOS); //业务层处理方法
        log.info(" ==> 数据保存结束 <==");
    }

    /**
     * 在转换异常 获取其他异常下会调用本接口。我们如果捕捉并手动抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        log.error(" ==> 数据解析失败,但是继续读取下一行:{}", exception.getMessage());
        //  如果是某一个单元格的转换异常 能获取到具体行号
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException convertException = (ExcelDataConvertException) exception;
            throw new BizException("第" + convertException.getRowIndex() + "行,第" + convertException.getColumnIndex() + "列数据解析异常");
        }
        throw exception;
    }

}

拿到即用不解释,自己悟,自己嚼的馒头最香;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值