Excel监听器:
package cn.com.git.dgmsdi.web.controller.batchProducts;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
public final class ExcelListener<T> extends AnalysisEventListener<T>{
/**
* 自定义用于暂时存储data
* 可以通过实例获取该值
*/
private List<T> datas = new ArrayList<>();
/**
* 每解析一行都会回调invoke()方法
* @param object 读取后的数据对象
* @param context 内容
*/
@Override
@SuppressWarnings("unchecked")
public void invoke(Object object, AnalysisContext context) {
T map = (T) object;
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
datas.add(map);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析结束销毁不用的资源
//注意不要调用datas.clear(),否则getDatas为null
}
/**
* 返回数据
* @return 返回读取的数据集合
**/
public List<T> getDatas() {
return datas;
}
/**
* 设置读取的数据集合
* @param datas 设置读取的数据集合
**/
public void setDatas(List<T> datas) {
this.datas = datas;
}
}
controller层:
@PostMapping(value = "/import")
public Map<String,List<String>> readExcel(MultipartFile file) throws IOException {
ExcelListener<BatchProductsReqDTO> listener = new ExcelListener<>();
//headRowNumber(1)从第2行开始读取,使用getDatas()方法取出数据
EasyExcel.read(file.getInputStream(), BatchProductsReqDTO.class, listener).headRowNumber(1).sheet(0).doRead();
List<BatchProductsReqDTO> list = listener.getDatas();
System.out.println(list);
//取出导入的数据list,并拼装报文向Service层传递
BaseRequestDTO<List<BatchProductsReqDTO>> baseRequestDTO = new BaseRequestDTO<>();
baseRequestDTO.setPayload(list);
//在Service层做业务逻辑处理,并返回错误信息存放在map中,比如{"0":["1","2"],"2":["3","4"]}说明:Excel中的数据在第一行第2、3列和第二行第4、5列的数据校验不通过(首列、首行都为0)
BaseResponseDTO<Map<String,List<String>>> multimapBaseResponseDTO = batchProductsService.importData(baseRequestDTO);
return multimapBaseResponseDTO.getPayload();
}
实体类:
package cn.com.git.dgmsdi.api.inside.dto.batchProducts;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author zhanghao
* @create 2022/7/27 14:33
*/
@Slf4j
@Getter
@Setter
@ToString
public class BatchProductsReqDTO {
/**
* 放款银行(Excel数据第二列)
*/
@ExcelProperty(value = "放款机构", index = 1)
private String loanBank;
/**
* 产品ID
*/
@ExcelProperty(value = "业务产品名称", index = 2)
private String productName;
/**
* 客户名称
*/
@ExcelProperty(value = "客户名称", index = 3)
private String custName;
/**
* 导入ID
*/
@ExcelIgnore
private String importId;
/**
* 导入批次号
*/
@ExcelIgnore
private String importBatchNo;
}