前言
最近我接手的项目来了一个需求,按照规定好的excel模板进行导入,导入成功的数据要插入到数据库中,于是在网上开始翻阅关于excel导入的教程,发现有很多是已经有上限的,有没有没有上限的excel导入呢,偶然看到了excel导入,alibaba开源的EasyExcel导入,感觉挺不错,就拿来用了。
一、EasyExcel是什么?
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:https://github.com/alibaba/easyexcel
二、使用步骤
1.引入库
<!--excel导入-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.8</version>
</dependency>
2.创建监听类
这里注意一下,因为这个类是不能被spring进行管理的,所以我们需要的什么实体类啊,这些的都要通过构造器传入
/**
* 导入监听器
*/
//
public class Listener extends AnalysisEventListener<Order>{
private Order ;
private OrderService orderService;
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT =300;
List<order> orderlist = new ArrayList<order>();
public Listener(Order order, OrderService orderService) {
this.orderParam = orderParam;
this.orderService=orderService;
}
/**
* 这个每一条数据解析都会来调用
*/
@Override
public void invoke(Order order, AnalysisContext context) {
orderlist .add(order);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
list.clear();
}
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
System.out.println("所有数据解析完成!");
}
/**
* 加上存储数据库
*/
private void saveData() {
for (Order order1: orderlist ) {
orderService.add(order1);
}
System.out.println("{}条数据,开始存储数据库!"+ orderlist .size());
}
}
3.使用
我的Controller是这样,仅供参考啊
/**
* excel导入接口
*/
@RequestMapping("/importexcel")
@ResponseBody
public ResponseData importexcel(@NotNull @RequestParam("file") MultipartFile file) throws Exception{
EasyExcel.read(file.getInputStream(), Order.class, new orderListener(order,orderService)).sheet().doRead();
return ResponseData.success();
}
总结
以上就是我使用alibaba的easyExcel的使用感受,不得不说,alibaba的开源的东西就是好用,打个call