EasyExcel枚舉值轉(zhuǎn)換工具

項(xiàng)目介紹

這是一個(gè)基于EasyExcel的枚舉值轉(zhuǎn)換工具,可以方便地將Java枚舉類型轉(zhuǎn)換為Excel中的文本或編碼值。

核心功能

  1. 支持枚舉值與Excel單元格的雙向轉(zhuǎn)換
  2. 可配置使用枚舉的文本值或編碼值進(jìn)行轉(zhuǎn)換

核心代碼

1. 枚舉值轉(zhuǎn)換基礎(chǔ)接口

package org.example.enums;

/**
 * 枚舉值轉(zhuǎn)換基礎(chǔ)接口
 * @author chenfukeng
 */
public interface ValueEnum {
    /**
     * 獲取枚舉編碼
     * @return 枚舉編碼
     */
    String getCode();

    /**
     * 獲取枚舉文本
     * @return 枚舉文本
     */
    String getText();
}

2. 枚舉值轉(zhuǎn)換規(guī)則

package org.example.enums;

/**
 * 枚舉值轉(zhuǎn)換規(guī)則
 * @author chenfukeng
 */
public enum EnumValueConverterRule {
    /**
     * 使用編碼值轉(zhuǎn)換
     */
    BY_CODE,
    
    /**
     * 使用文本值轉(zhuǎn)換
     */
    BY_TEXT
}

3. 轉(zhuǎn)換規(guī)則注解

package org.example.annotation;

import org.example.enums.EnumValueConverterRule;

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

/**
 * 枚舉值轉(zhuǎn)換規(guī)則注解
 * @author chenfukeng
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumValueConverterRuleAnnotation {
    /**
     * 轉(zhuǎn)換規(guī)則
     * @return 轉(zhuǎn)換規(guī)則
     */
    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 {
    /**
     * 反序列化的目標(biāo)類型
     * @return 目標(biāo)類型Class
     */
    Class<? extends Object> value();
}

5. 示例枚舉類

package org.example.enums;

/**
 * 狀態(tài)枚舉示例
 * @author chenfukeng
 */
public enum StatusEnum implements ValueEnum {
    /**
     * 激活狀態(tài)
     */
    ACTIVE("1", "激活"),

    /**
     * 未激活狀態(tài)
     */
    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. 枚舉值轉(zhuǎn)換器

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;

/**
 * 枚舉值轉(zhuǎn)換器
 * @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導(dǎo)出測(cè)試
 * @author chenfukeng
 */
public class StatusEnumExcelTest {

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

        // 創(chuàng)建測(cè)試數(shù)據(jù)
        ExcelData data1 = new ExcelData();
        data1.setId(1);
        data1.setName("測(cè)試1");
        data1.setStatus(StatusEnum.ACTIVE);

        ExcelData data2 = new ExcelData();
        data2.setId(2);
        data2.setName("測(cè)試2");
        data2.setStatus(StatusEnum.INACTIVE);

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

        // 執(zhí)行導(dǎo)出
        EasyExcel.write(fileName, ExcelData.class).sheet("測(cè)試數(shù)據(jù)").doWrite(dataList);
    }

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

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

        @EnumValueConverterRuleAnnotation(EnumValueConverterRule.BY_TEXT)
        @ExcelProperty(value = "狀態(tài)", 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;
        }
    }
}

輸出結(jié)果

ID 名稱 狀態(tài)
1 測(cè)試1 激活
2 測(cè)試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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容