乐趣区

关于java:easyExcel的使用小结

easyExcel 的应用小结

大家伙,我的程序员田同学。明天带来的是 esayExcel 的简略应用小结,一个高效的 Excel 的解决框架

长期接到领导要求须要做一个 Excel 导入性能,于是施展我的专长——面向百度编程。

在百度搜寻了一圈都是 POi 导入形式,找到一个看着还算靠谱的 demo,这种形式在我看来相当的轻便,读取到 Excel 内容后一一进行判断。折腾了一个上午,代码像是一个年迈的老人 - 岿然不动,为我的菜感到汗颜。

通过公司经验丰富的老人的领导,应用阿里巴巴开源的 easyExcel 导入形式应用很便捷,更重要的是快,十分钟就实现了整个导入过程的开发。

书归正传,正式进入 easyExcel 的应用过程。

一、导入依赖

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>2.1.1</version>
</dependency>

二、编写 entity 类

public class MedicineBasicImport implements Serializable {

    /**
     * 药品编码
     */
    @ExcelProperty("药品编码")
    private String code;
    /**
     * 药品类型
     */
    @ExcelProperty("药品类型")
    private String type;
     /**
     * 药品名称
     */
    @ExcelProperty("药品名称")
    private String title;

}

特地指出的是,实体属性上须要减少 @ExcelProperty 注解与 Excel 的表头对应。

三、写操作

 @Override
    public int importBasicMedicine(MultipartFile file, Long updateSupport) {
        try {BufferedInputStream bufferedInputStream=new BufferedInputStream(file.getInputStream());
            EasyExcel.read(bufferedInputStream, MedicineBasicImport.class,new ImportMedicineService(updateSupport,medicineBasicMapper))
                .sheet()
                .doRead();;} catch (IOException e) {e.printStackTrace();
        }
        return 0;
    }

调用 EasyExcel.read() 办法,须要传递三个参数,1、文件流 2、实体类 3、new ImportMedicineService(updateSupport,medicineBasicMapper) 解决的业务类

四、业务实现

ImportMedicineService 须要咱们继承 AnalysisEventListener 类 并实现它的两个办法,invoke() 和 doAfterAllAnalysed() 办法。

public class ImportMedicineService extends AnalysisEventListener<MedicineBasicImport> {
    private Long topDeptId;
    private TMedicineBasicMapper medicineBasicMapper;

    List<TMedicineBasic> list =  new ArrayList<>();

    public ImportMedicineService(Long updateSupport, TMedicineBasicMapper medicineBasicMapper) {
        topDeptId=updateSupport;
        this.medicineBasicMapper=medicineBasicMapper;
    }

    // 每读取一行就调用该办法
    @Override
    public void invoke(MedicineBasicImport data, AnalysisContext context) {TMedicineBasic tMedicineBasic=new TMedicineBasic();
        tMedicineBasic.setId(IdUtils.simpleUUID());
        tMedicineBasic.setTopDeptId(topDeptId);
        BeanUtils.copyProperties(data,tMedicineBasic);
        list.add(tMedicineBasic);
    }

    // 全副读取实现就调用该办法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {medicineBasicMapper.insertList(list);
    }

当咱们调用导入接口时会调用到 AnalysisEventListener 的实现类的 invoke() 办法,然而每读取一行都会执行 invoke() 办法,大部分业务场景都会把读取的内容存入到数据库中,如果读取一行就保留到数据库,这对于数据库来说几乎是一个劫难。

比拟好的形式就是在 doAfterAllAnalysed() 办法中执行数据库的操作,将屡次数据库 IO 转为一次 IO。

这种形式是不是比 PIO 要简略一些呢?

如果没有意外这应该是农历 2021 年最初一篇技术博客了,好啦,明年见!

提取预祝大家新年快乐哈。

退出移动版