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年最初一篇技术博客了,好啦,明年见!
提取预祝大家新年快乐哈。