EasyExcel 导出字段处理

import java.lang.annotation.*;

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

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

/**
 * @Description:
 * @DateTime: 2023/8/24 14:46
 */
@Getter
public enum MessageStatusEnum {
    SET_UP(0, "UNREAD"),
    RUNNING(1, "READ"),
    ;
    public static Map<Integer, MessageStatusEnum> MAPS = new HashMap<>();

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

    private final Integer code;
    private final String name;

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

    public static MessageStatusEnum codeOf(Object code) {
        return MAPS.getOrDefault((Integer)code, null);
    }
}
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 com.ruijie.common.core.annotation.EasyExcel;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
 * @Description: excel导出数值转字符串
 * @DateTime: 2023/8/24 14:13
 */
public class CaseStateConverter implements Converter<Object> {
    @Override
    public Class supportJavaTypeKey() {
        //指定状态码类型
        return Object.class;
    }

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

    @Override
    public WriteCellData<?> convertToExcelData(Object 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", Object.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);
    }
}

实体类使用

    /**
     * 消息状态 0未读/1已读
     */
    @ApiModelProperty(value = "消息状态 0未读/1已读")
    @ExcelProperty(value = "messageStatus",converter = CaseStateConverter.class)
    @EasyExcel(type = MessageStatusEnum.class)
    private int messageStatus;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
EasyExcel是一个基于Java语言,功能强大的Excel操作工具,可以实现非常灵活的Excel导入导出功能。要实现自定义字段导出,可以通过实现EasyExcel的WriteHandler接口来实现。 首先,需要定义一个实现WriteHandler接口的类,例如: ```java public class CustomFieldHandler implements WriteHandler { // 自定义字段列表 private List<String> fields; public CustomFieldHandler(List<String> fields) { this.fields = fields; } @Override public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { // 在Sheet创建后,添加自定义字段行 Sheet sheet = writeSheetHolder.getSheet(); sheet.createRow(0); for (int i = 0; i < fields.size(); i++) { sheet.getRow(0).createCell(i).setCellValue(fields.get(i)); } } @Override public void beforeSheetFlush(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder, Sheet sheet) { // 在Sheet刷新前,设置自定义字段列宽 for (int i = 0; i < fields.size(); i++) { sheet.setColumnWidth(i, 20 * 256); } } @Override public void afterRowCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder, Row row, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) { // 在每行创建后,设置自定义字段值 if (isHead) { return; } for (int i = 0; i < fields.size(); i++) { row.createCell(i).setCellValue("自定义字段值"); } } } ``` 上述代码中,CustomFieldHandler类实现了WriteHandler接口,并在其中实现了afterSheetCreate、beforeSheetFlush和afterRowCreate三个方法,分别对应Sheet创建后、Sheet刷新前和每行创建后的处理逻辑。其中,afterSheetCreate方法会在Sheet创建后添加一行自定义字段行,beforeSheetFlush方法会在Sheet刷新前设置自定义字段列宽,afterRowCreate方法会在每行创建后设置自定义字段值。 接下来,可以通过EasyExcel的WriteBuilder来构建导出流程,并将CustomFieldHandler类实例化并添加到WriteBuilder中。例如: ```java List<String> fields = new ArrayList<>(); fields.add("自定义字段1"); fields.add("自定义字段2"); // 构建导出流程 OutputStream out = new FileOutputStream("test.xlsx"); WriteWorkbook writeWorkbook = EasyExcel.write(out).registerWriteHandler(new CustomFieldHandler(fields)).build(); // 写入数据 WriteSheet writeSheet = EasyExcel.writerSheet().build(); writeWorkbook.write(dataList, writeSheet); // 完成导出 writeWorkbook.finish(); ``` 上述代码中,首先定义了一个自定义字段列表fields,然后通过EasyExcel的WriteBuilder构建导出流程,并将CustomFieldHandler类实例化并注册到WriteBuilder中。在写入数据时,会自动调用CustomFieldHandler中的方法来处理自定义字段导出逻辑。 通过上述方法,就可以很方便地实现自定义字段导出功能了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值