问题:当我们到处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”。