前言
上篇文章带各位小伙伴完成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();
}
}
到这里我们就把整个核心逻辑搭建好啦,是不是很简单,接下来给大家跑个例子。
三、实战
- 定义一个导入文件接收实体类
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第一列)
- 定义一个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();
}
}
- 调用http接口导入数据
准备导入文件
导入过程,我们可以看到调用了invoke方法,我们可以在invoke方法做一些我们想做的事情哈哈,别想歪了哦,比如:add()到静态list里面或者直接存到数据都是可以的。
四、总结
到这里就完成了整个Java之Excel导入功能的实现,其实也很简单对吧,大家只需要Ctrl+C、Ctrl+V就可以快速应用啦,希望可以帮助到大家,上期已输出excel导出功能的实现!
加油打工人!奥利给😎
我是rose,感谢各位的观看,各位的点赞就是rose输出的最大动力,我们下篇文章见!
注:如果本篇博客有任何错误和建议,欢迎人才们留言!