首先,这个是读取和导出exl都需要用到的实体类的基类,这个是可以扩展的,读取失败的exl想要加入其它列的字段都可以加在这里
pom
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.4</version>
</dependency>
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
//读取exl的错误导出基础类,用来存放基础数据
public class EasyExcelErrBaseVo extends BaseRowModel {
@ExcelProperty(value = {"失败原因"})
protected String remark;
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
二 读取的入口
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import lombok.extern.slf4j.Slf4j;
/**
* 这个是读取exl的工具类
*/
@Slf4j
public class EasyExcelReadUtil {
public static JsonMessage easyRead(EasyRealInterface easyRealInterface, String fileName, Class cls,String errfilepath) {
try {
// 写法2:
easyRealInterface.setErrcla(cls);
ExcelReader excelReader = EasyExcel.read(fileName,cls, new EasyExcelLister(easyRealInterface)).build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
excelReader.read(readSheet);
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish();
return easyRealInterface.finish(errfilepath);
} catch (Exception e) {
log.error(easyRealInterface.getreportName() + "读取excel异常", e);
return new JsonMessage(false,"服务器异常,请重新上传");
}
}
}
三 配置监听器
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* excel读取的监听器
*/
@Slf4j
public class EasyExcelLister<T> extends AnalysisEventListener<T> {
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static int BATCH_COUNT = 30;
List<T> list = new ArrayList<T>();
EasyRealInterface easyRealInterface;
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*
* @param easyRealInterface ,传入批量处理的接口,每达到多少条就进行一次批量处理
*/
public EasyExcelLister(EasyRealInterface easyRealInterface) {
this.easyRealInterface=easyRealInterface;
}
/**
*
* @param easyRealInterface ,继承该接口进行业务逻辑的处理,每次保存多少
* @param BATCH_COUNT ,每次解析的数量
*/
public EasyExcelLister(EasyRealInterface easyRealInterface,int BATCH_COUNT) {
this.easyRealInterface=easyRealInterface;
this.BATCH_COUNT=BATCH_COUNT;
}
/**
* 这个每一条数据解析都会来调用
*
* @param data
* one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @