pom 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.8</version>
</dependency>
编写实体解析对应的实体类,如下,一个字段对应多个列名称,easyexcel目前未实现一列多名称的解析,此文档适用于导入模板列名调整,同时兼容之前的版本
package eample.model;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
@ExcelIgnoreUnannotated
public class ExpectionWhiteListUserImportVO {
/**
* 姓名
*/
@ExcelProperty(value = {"姓名","名字"})
private String name;
/**
* 国际代码1
*/
@ExcelProperty(value = {"国际代码1","区号"})
private String areaCode;
/**
* 手机号
*/
@ExcelProperty(value = {"手机号","电话号码"})
private String phone;
}
编写解析类
package com.ev.easyexcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 导入处理监听
*
* @date 2021/9/1 15:11
*/
public class CustomizeListener extends AnalysisEventListener<Map<Integer, String>> {
private static final int BATCH_COUNT = 2000;
private Map<String, Integer> fieldValue = new HashMap<>();
public List<Object> list = new ArrayList<>();
public Class<?> classType;
public CustomizeListener(Class<?> classType) {
this.classType = classType;
}
public CustomizeListener() {
}
/**
* 数据表头获取,表头位置对应
*
* @param headMap
* @param context
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
fieldValue.putAll(EasyExcelParsing.fieldValueSet(headMap, classType));
super.invokeHeadMap(headMap, context);
}
/**
* 数据一条一条解析
*
* @param data
* @param analysisContext
*/
@Override
public void invoke(Map<Integer, String> data, AnalysisContext analysisContext) {
if (fieldValue.isEmpty()) {
throw new ExcelAnalysisException("模板错误");
}
Object obj = null;
try {
obj = classType.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
EasyExcelParsing.setFieldValue(data, fieldValue, obj);
list.add(obj);
if (list.size() >= BATCH_COUNT) {
dataDeal();
list.clear();
}
}
public void dataDeal() {
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
dataDeal();
}
}
列值对应
package com.ev.easyexcel;
import com.alibaba.excel.annotation.ExcelProperty;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* easyExcel支持表头多名称解析
*
* @date 2021/10/29 15:48
*/
public class EasyExcelParsing {
/**
* 字段值赋值
*
* @param valueMap 值对应所在位置
* @param obj 实体类
* @param fieldValue 表头对应所在位置
*/
public static void setFieldValue(Map<Integer, String> valueMap, Map<String, Integer> fieldValue, Object obj) {
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
//遍历每个属性
if (field.isAnnotationPresent(ExcelProperty.class) && fieldValue.containsKey(field.getName())) {
field.setAccessible(true);
try {
field.set(obj, valueMap.get(fieldValue.get(field.getName())));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
/**
* 根据表头获取列所在位置
*
* @param headMap 表头map
* @param cla 对应解析类
* @return
*/
public static Map<String, Integer> fieldValueSet(Map<Integer, String> headMap, Class<?> cla) {
Map<String, Integer> fieldValue = new HashMap<>();
Field[] fields = cla.getDeclaredFields();
for (Field field : fields) {
//遍历每个属性
if (field.isAnnotationPresent(ExcelProperty.class)) {
ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
for (Map.Entry<Integer, String> entry : headMap.entrySet()) {
if (Arrays.asList(excelProperty.value()).contains(entry.getValue())) {
fieldValue.put(field.getName(), entry.getKey());
}
}
}
}
return fieldValue;
}
}
编写自己的处理类
package eample.model;
import com.ev.easyexcel.CustomizeListener;
/**
* 导入处理监听
*
* @date 2021/9/1 15:11
*/
public class MyListener extends CustomizeListener {
public MyListener(Class<?> classType) {
super(classType);
}
@Override
public void dataDeal() {
list.forEach(item->{
ExpectionWhiteListUserImportVO expectionVO= (ExpectionWhiteListUserImportVO) item;
System.out.println(expectionVO.getName());
System.out.println(expectionVO.getAreaCode());
System.out.println(expectionVO.getPhone());
});
}
}
启动代码
EasyExcelFactory.read("C:\\Users\\Administrator\\Desktop\\模板.xlsx", new MyListener(ExpectionWhiteListUserImportVO.class)).headRowNumber(1).sheet().doRead();
就可以正常解析了