为了账号安全,请及时绑定邮箱和手机立即绑定

easyExcel的使用小结

标签:
Java

easyExcel的使用小结

大家好,我的程序员田同学。今天带来的是esayExcel的简单使用小结,一个高效的Excel的处理框架

临时接到领导要求需要做一个Excel导入功能,于是发挥我的特长——面向百度编程。

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

经过公司经验丰富的老人的指导,使用阿里巴巴开源的easyExcel导入方式使用很便捷,更重要的是快,十分钟就完成了整个导入过程的开发。

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

一、导入依赖

  com.alibaba   easyexcel   2.1.1

二、编写entity类

public class MedicineBasicImport implements Serializable {

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

}

特别指出的是,实体属性上需要增加 @ExcelProperty注解与Excel的表头对应。

https://img1.sycdn.imooc.com//61f0f1ef0001477a04190259.jpg

三、写操作

@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 {
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年最后一篇技术博客了,好啦,明年见!

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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消