项目介绍
这是一个基于EasyExcel的枚举值转换工具,可以方便地将Java枚举类型转换为Excel中的文本或编码值。
核心功能
- 支持枚举值与Excel单元格的双向转换
- 可配置使用枚举的文本值或编码值进行转换
核心代码
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>







网友评论