項(xiàng)目介紹
這是一個(gè)基于EasyExcel的枚舉值轉(zhuǎn)換工具,可以方便地將Java枚舉類型轉(zhuǎn)換為Excel中的文本或編碼值。
核心功能
- 支持枚舉值與Excel單元格的雙向轉(zhuǎn)換
- 可配置使用枚舉的文本值或編碼值進(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>