1.先在ExcelUtils中获取:
/** * 字段值赋值 * * @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 { //处理非String if(field.getType().getTypeName().equals("java.lang.Double")){ field.set(obj, Double.parseDouble(valueMap.get(fieldValue.get(field.getName())))); }else if(field.getType().getTypeName().equals("java.lang.Integer")){ field.set(obj, Integer.parseInt(valueMap.get(fieldValue.get(field.getName())))); }else{ 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; }
2。写一个自定义监听器
package com.ceprei.salarysystem.utils;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.CellExtra;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author :mq
* @date : 2023/7/7
*/
@Slf4j
public class CustomizeListener extends AnalysisEventListener<Map<Integer, String>> {
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(ExcelUtils.fieldValueSet(headMap, classType));
log.info("解析到一条头数据:{}", headMap);
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();
}
ExcelUtils.setFieldValue(data, fieldValue, obj);
list.add(obj);
}
/***
* 数据处理
* 重写这个即可
*/
public void dataDeal() {
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
dataDeal();
}
}
3.读入数据时new自定义监听器即可
public void readSheetData_v2( File file, List<ReadSheet> readSheets){ for (ReadSheet readSheet : readSheets) { EasyExcel.read(file,new CustomizeListener(Person.class){ List<Person> personList= new ArrayList<>(); public void dataDeal() { for (Object o : list) { //自己的数据处理 } }).headRowNumber(5).sheet(readSheet.getSheetNo()).doRead(); }