【JAVA】easyexcel 一个表头对应多个名称解析

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();

就可以正常解析了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天空~华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值