Java之Excel导入功能快速实现

前言

上篇文章带各位小伙伴完成excel导入功能快速实现,很简单对吧。

最近因为公司业务要求数据清洗,被迫快速实现导入业务整理的数据进行处理。
业务:2个小时可以完成吧?
我:嗯,应该没问题(您们真把我们开发当神仙呢)。
还好之前做过导出功能,导入应该也不远了,不慌!
在这里插入图片描述
那么接下来给大家输出excel导入实现

一、引入依赖

<!-- excel导出 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.11</version>
</dependency>

二、核心方法

/**
 * 读取excel
 * @param filePath 需要导入文件路径
 * @param clazz    接收实体类(下文会说明实体类属性和excel对应关系!!!)
 */
public static void readExcel(String filePath, Class clazz){
    FileInputStream fis;
    try {
        fis = new FileInputStream(filePath);
        readExcel(fis, clazz);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}
/**
 * @param is   导入文件输入流
 * @param clazz Excel实体映射类
 * @return
 */
public static Boolean readExcel(InputStream is, Class clazz){
    BufferedInputStream bis = null;
    try {
        bis = new BufferedInputStream(is);
        // 解析每行结果在listener中处理(所以我们接收逻辑需要在监听器里面处理)
        AnalysisEventListener listener = new ExcelListener();
        ExcelReader excelReader = EasyExcelFactory.getReader(bis, listener);
        excelReader.read(new Sheet(1, 1, clazz));
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        if (bis != null) {
            try {
                bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return true;
}
/** 
 * 解析监听器
 * 每解析一行会回调invoke()方法。
 * 整个excel解析结束会执行doAfterAllAnalysed()方法
 *
 * 下面只是我写的一个样例而已,可以根据自己的逻辑修改该类。
 */
public class ExcelListener extends AnalysisEventListener {
 
    //自定义用于暂时存储data。
    //定义成静态变量,不过要注意的是我们try-catch导入逻辑的时候记得要在finally手动调用clear()方法,因为我们可能在解析excel的时候抛异常了,这个时候doAfterAllAnalysed()方法是不会执行的,如果没有清空静态变量的数据就会有脏数据(也就是上次解析成功的数据还在)
    public static List<Object> datas = new ArrayList<>();

    @Override
    public void invoke(Object object, AnalysisContext context) {
        System.out.println("导入数据:"+ JSONUtil.toJsonStr(object));
        // 这边可以进行其他操作,如直接存入数据库
        datas.add(object);
    }
    
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
         datas.clear();//解析结束销毁不用的资源
    }

    public static void clear(){
        datas.clear();
    }
}

到这里我们就把整个核心逻辑搭建好啦,是不是很简单,接下来给大家跑个例子。

三、实战

  1. 定义一个导入文件接收实体类
import com.alibaba.excel.annotation.ExcelProperty;

/**
 * 导入文件接收实体类
 */
@Data
public class ExcelImportRequestDTO {

    @ExcelProperty(index = 0)
    private String name;

    @ExcelProperty(index = 1)
    private String age;

}

注:这边@ExcelProperty 注解用来映射excel列数。index的值就代表excel的列数(如:index=0表示映射到excel第一列)

  1. 定义一个http接口
@PostMapping("/import")
public void importTest(@RequestBody Map<String, String> params) {
    ExcelUtil.readExcel(params.get("filePath"), ExcelImportRequestDTO.class);
    try{
        // 直接拿监听器的静态list
        List<Object> datas = ExcelListener.datas;
        log.info(JsonUtil.toJson(datas));
    }catch (Exception e){
        
    }finally {
        // 要养成释放资源的习惯哦
        ExcelListener.clear();
    }
}
  1. 调用http接口导入数据

准备导入文件
在这里插入图片描述
导入过程,我们可以看到调用了invoke方法,我们可以在invoke方法做一些我们想做的事情哈哈,别想歪了哦,比如:add()到静态list里面或者直接存到数据都是可以的。
在这里插入图片描述

四、总结

到这里就完成了整个Java之Excel导入功能的实现,其实也很简单对吧,大家只需要Ctrl+C、Ctrl+V就可以快速应用啦,希望可以帮助到大家,上期已输出excel导出功能的实现!

加油打工人!奥利给😎

我是rose,感谢各位的观看,各位的点赞就是rose输出的最大动力,我们下篇文章见!

注:如果本篇博客有任何错误和建议,欢迎人才们留言!

五、系列推荐

《Java之Excel导出功能快速实现》

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值