美文网首页
EasyExcel枚举值转换工具

EasyExcel枚举值转换工具

作者: 陈柴盐 | 来源:发表于2025-05-08 12:35 被阅读0次

项目介绍

这是一个基于EasyExcel的枚举值转换工具,可以方便地将Java枚举类型转换为Excel中的文本或编码值。

核心功能

  1. 支持枚举值与Excel单元格的双向转换
  2. 可配置使用枚举的文本值或编码值进行转换

核心代码

1. 枚举值转换基础接口

package org.example.enums;

/**
 * 枚举值转换基础接口
 * @author chenfukeng
 */
public interface ValueEnum {
    /**
     * 获取枚举编码
     * @return 枚举编码
     */
    String getCode();

    /**
     * 获取枚举文本
     * @return 枚举文本
     */
    String getText();
}

2. 枚举值转换规则

package org.example.enums;

/**
 * 枚举值转换规则
 * @author chenfukeng
 */
public enum EnumValueConverterRule {
    /**
     * 使用编码值转换
     */
    BY_CODE,
    
    /**
     * 使用文本值转换
     */
    BY_TEXT
}

3. 转换规则注解

package org.example.annotation;

import org.example.enums.EnumValueConverterRule;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 枚举值转换规则注解
 * @author chenfukeng
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumValueConverterRuleAnnotation {
    /**
     * 转换规则
     * @return 转换规则
     */
    EnumValueConverterRule value();
}

4. 反序列化类型注解

package org.example.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 枚举值反序列化类型注解
 * @author chenfukeng
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumValueDeserializeClassType {
    /**
     * 反序列化的目标类型
     * @return 目标类型Class
     */
    Class<? extends Object> value();
}

5. 示例枚举类

package org.example.enums;

/**
 * 状态枚举示例
 * @author chenfukeng
 */
public enum StatusEnum implements ValueEnum {
    /**
     * 激活状态
     */
    ACTIVE("1", "激活"),

    /**
     * 未激活状态
     */
    INACTIVE("0", "未激活");

    private final String code;
    private final String text;

    StatusEnum(String code, String text) {
        this.code = code;
        this.text = text;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getText() {
        return text;
    }
}

6. 枚举值转换器

package org.example.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ReadConverterContext;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.fastjson.JSON;
import cn.hutool.core.util.NumberUtil;
import org.example.annotation.EnumValueConverterRuleAnnotation;
import org.example.annotation.EnumValueDeserializeClassType;
import org.example.enums.EnumValueConverterRule;
import org.example.enums.ValueEnum;

import javax.naming.OperationNotSupportedException;
import java.lang.reflect.Field;
import java.util.Objects;

/**
 * 枚举值转换器
 * @author chenfukeng
 */
public class EnumValueToStringConverter implements Converter<ValueEnum> {

    @Override
    public ValueEnum convertToJavaData(ReadConverterContext<?> context) throws Exception {
        Field field = context.getContentProperty().getField();
        ReadCellData<?> cellData = context.getReadCellData();
        EnumValueDeserializeClassType deserializeRule = field.getAnnotation(EnumValueDeserializeClassType.class);
        if (Objects.isNull(deserializeRule)) {
            throw new OperationNotSupportedException();
        }
        Class<?> clazz = deserializeRule.value();

        if (!ValueEnum.class.isAssignableFrom(clazz)) {
            throw new OperationNotSupportedException();
        }

        Integer cellDataValue = null;
        if (CellDataTypeEnum.STRING.equals(cellData.getType()) && NumberUtil.isNumber(cellData.getStringValue())) {
            cellDataValue = Integer.valueOf(cellData.getStringValue());
        }
        if (CellDataTypeEnum.NUMBER.equals(cellData.getType())) {
            cellDataValue = cellData.getNumberValue().intValue();
        }
        if (Objects.nonNull(cellDataValue)) {
            return (ValueEnum) JSON.parse(cellDataValue.toString(), clazz);
        }

        return null;
    }

    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<ValueEnum> context) throws Exception {
        Field field = context.getContentProperty().getField();
        ValueEnum value = context.getValue();
        EnumValueConverterRuleAnnotation valueRuleAnnotation = field.getAnnotation(EnumValueConverterRuleAnnotation.class);

        EnumValueConverterRule valueRule = Objects.nonNull(valueRuleAnnotation) ? valueRuleAnnotation.value() : EnumValueConverterRule.BY_TEXT;

        if (EnumValueConverterRule.BY_TEXT.equals(valueRule)) {
            return new WriteCellData<>(value.getText());
        } else if (EnumValueConverterRule.BY_CODE.equals(valueRule)) {
            return new WriteCellData<>(value.getCode());
        }

        return new WriteCellData<>("");
    }
}

使用示例

package org.example;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.EasyExcel;
import org.example.annotation.EnumValueConverterRuleAnnotation;
import org.example.converter.EnumValueToStringConverter;
import org.example.enums.EnumValueConverterRule;
import org.example.enums.StatusEnum;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 枚举值Excel导出测试
 * @author chenfukeng
 */
public class StatusEnumExcelTest {

    @Test
    public void testExportEnumToExcel() {
        String fileName = "enum_export_test.xlsx";
        List<ExcelData> dataList = new ArrayList<>();

        // 创建测试数据
        ExcelData data1 = new ExcelData();
        data1.setId(1);
        data1.setName("测试1");
        data1.setStatus(StatusEnum.ACTIVE);

        ExcelData data2 = new ExcelData();
        data2.setId(2);
        data2.setName("测试2");
        data2.setStatus(StatusEnum.INACTIVE);

        dataList.add(data1);
        dataList.add(data2);

        // 执行导出
        EasyExcel.write(fileName, ExcelData.class).sheet("测试数据").doWrite(dataList);
    }

    public static class ExcelData {
        @ExcelProperty("ID")
        private Integer id;

        @ExcelProperty("名称")
        private String name;

        @EnumValueConverterRuleAnnotation(EnumValueConverterRule.BY_TEXT)
        @ExcelProperty(value = "状态", converter = EnumValueToStringConverter.class)
        private StatusEnum status;

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public StatusEnum getStatus() {
            return status;
        }

        public void setStatus(StatusEnum status) {
            this.status = status;
        }
    }
}

输出结果

ID 名称 状态
1 测试1 激活
2 测试2 未激活

依赖配置

<dependencies>
    <!-- EasyExcel -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>3.3.3</version>
    </dependency>

    <!-- FastJSON -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.83</version>
    </dependency>

    <!-- Hutool工具包 -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.25</version>
    </dependency>
</dependencies>

地址:https://gitee.com/ChaiYe/easy-excel-serial

相关文章

网友评论

      本文标题:EasyExcel枚举值转换工具

      本文链接:https://www.haomeiwen.com/subject/uobsijtx.html