easyExecl状态字段转换(获取枚举的文字信息)

问题:当我们到处excel的时候,发现枚举类导出的依然是状态码(code)。但是我们想直接得到状态码对应的文字信息(name),将其作为excel导出。

思路:我们只有枚举类的状态码,除了状态码肯定还需要指定这是那个枚举的状态码。然后通过枚举类信息与状态码取出枚举的文字信息。

实现方案:通过注解传递枚举类信息,在转为excel数据时扫描注解并将数据进行相应替换,可使用excel的 “@ExcelProperty(value = “”,index = 0,converter = EConverter.class)”指定转换动作。在转换器中使用反射获取枚举类,再调用统一名称的get方法获取即可。

1、编写注解结构,内部仅一个参数,指定为一个枚举类型

import java.lang.annotation.*;

/**
 * 指定枚举类注解
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EasyExcel {
    /**
     * 控件类型
     * @return
     */
    Class<? extends Enum> type();
}

2、编写转换器

import cn.xxx.system.common.annotation.EasyExcel;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 状态枚举信息获取(0代表女性,1代表男男性 进行转换)
 */
public class EConverter implements Converter<Integer> {
    @Override
    public Class supportJavaTypeKey() {
    //指定状态码类型
        return Integer.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
    //指定需要获取的参数类型
        return CellDataTypeEnum.STRING;
    }

    @Override
    public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
    //value:状态码  contentProperty:字段属性  globalConfiguration:全局配置
    	//获取字段属性中的注解
        Field field = contentProperty.getField();
        EasyExcel easyExcel = field.getAnnotation(EasyExcel.class);
        //获取注解中的枚举信息
        Class<? extends Enum> type = easyExcel.type();
        //获取枚举类的方法名 “codeOf”就是自己编写的函数,Integer.class 指定入参类型
        Method codeOf = type.getMethod("codeOf", Integer.class);
        //反射执行方法,此方法得到的是一个枚举实例(具体得到什么,结合自身项目)
        Object invoke = codeOf.invoke(type, value);
        //枚举实例调用getname方法,得到name的值
        Method getName = invoke.getClass().getMethod("getName");
        String name = String.valueOf(getName.invoke(invoke));
        //将转换的值进行返回
        return  new WriteCellData(name);
    }
}

3、枚举类

package cn.xxx.system.common.enums;

import lombok.Getter;

import java.util.HashMap;
import java.util.Map;

@Getter
public enum ProjectStatusEnum {
    SET_UP(0, "立项"),
    RUNNING(1, "施工中"),
    FINISH(2, "已竣工"),
    ;
    public static Map<Integer, ProjectStatusEnum> MAPS = new HashMap<>();

    static {
        for (ProjectStatusEnum e : values()) {
            MAPS.put(e.getCode(), e);
        }
    }

    private final Integer code;
    private final String name;

    ProjectStatusEnum(Integer code, String name) {
        this.code = code;
        this.name = name;
    }

    public static ProjectStatusEnum codeOf(Integer code) {
        return MAPS.getOrDefault(code, null);
    }
}

4、需要导出的excel实体类

package cn.xxx.system.entity.list;

import cn.xxx.system.common.annotation.EasyExcel;
import cn.xxx.system.common.enums.ProjectStatusEnum;
import cn.xxx.system.common.excel.EConverter;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;


/**
 * 项目工程 project
 */
@Data
public class ProjectPageVo {
 
    /**
     * 项目状态
     */
    @ExcelProperty(value = "项目状态",index = 0,converter = EConverter.class)
    @EasyExcel(type = ProjectStatusEnum.class)
    private Integer status;
}

注意事项:枚举类必须有相同方法,如本文中的“codeOf”。

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值