EasyExcel代码及官方文档:https://github.com/alibaba/easyexcel
最近项目中遇到需要Excel导入数据的情况,由于几十万条的数据量过大,再加上逻辑处理比较多,最初采用poi导入,占用资源过大,导入过程中服务器内存几乎100%占用,耗时较久,因此更换为EasyExcel。实测效果确实立竿见影,效率至少提升一倍,在这里把代码贴上,不足之处欢迎指正。
1导入jar包
先到mvn上搜索依赖包,引入pom中,下面是最新的
<!--easyexcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.2-beat1</version>
</dependency>
2创建模型
实际使用中,我认为创建模型时相对快捷而且不容易出错的方式,可以通过String类型接收数据后,自己再转换类型,防止类型转换错误。
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Tolerate;
import java.io.Serializable;
@Data
@Builder
public class JmmImport extends BaseRowModel implements Serializable {
@Tolerate
public JmmImport(){}
/**
* 门店编码
*/
@ExcelProperty(value ="门店编码",index = 0)
private String storeCode;
/**
* 商品编码
*/
@ExcelProperty(value ="商品编码",index = 1)
private String goodsCode;
/**
* 商品名称
*/
@ExcelProperty(value ="商品名称",index = 2)
private String goodsName;
/**
* 商品品类code
*/
@ExcelProperty(value ="商品品类code",index = 3)
private String goodsClassCode;
/**
* 商品属性code
*/
@ExcelProperty(value ="商品属性code",index = 4)
private String goodsAttrCode;
/**
* 档期起始时间
*/
@ExcelProperty(value ="档期起始时间",index = 5)
private String beginTime;
/**
* 档期结束时间
*/
@ExcelProperty(value ="档期结束时间",index = 6)
private String overTime;
}
3正式导入
List<Object> objs = EasyExcelFactory.read(multipartFile.getInputStream(), new com.alibaba.excel.metadata.Sheet(1, 1,JmmImport.class));
List<JmmDetailSold> excelList = Lists.newArrayList();
for (Object o : objs) {
if (o instanceof JmmImport) {
JmmDetailSold excel = JmmDetailSold.builder()
.storeCode(((JmmImport) o).getStoreCode())
.goodsCode(((JmmImport) o).getGoodsCode())
.goodsName(((JmmImport) o).getGoodsName())
.goodsClassCode(((JmmImport) o).getGoodsClassCode())
.goodsAttrCode(((JmmImport) o).getGoodsAttrCode())
.beginTime(Timestamp.valueOf(((JmmImport) o).getBeginTime()))
.overTime(Timestamp.valueOf(((JmmImport) o).getOverTime()))
.build();
excelList.add(excel);
}
}