问题描述
近期在工作过程中,业务涉及各种导入导出,且包含单选、多选问题,针对于easyExcel的一些枚举转换数据,有了一点其他想法,按照官方文档中:读Excel | Easy Excel (alibaba.com),提供了自定义转换器的实现接口,但是我在网上搜索发现都比较单一,也就是一个枚举类需要写一个单独的转换器,这样的话会增加无意义工作量,所以想到了通过自定义注解+重新easyExcel转换器实现通用的easyExcle转换器。
话不多说,直接上代码:
1.重写EasyExcel转换器接口,对excel读和写方法都进行自定义
package com.example.test.excel;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* excel导入导出针对枚举类型的转换器
*
* @Author 996
* @Date 2024/3/13
*/
public class EasyExcelConvert implements Converter
2.自定义注解,包含3个参数,分别是枚举类型的字符串,多选场景下的分隔符,单选枚举or多选枚举
package com.example.test.excel;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 对excel导入时,处理枚举转化
* @Author 996
* @Date 2024/3/13
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumFiledConvert {
/**
* 枚举映射map key-value,key-value,key-value,key-value
* @return
*/
String enumMap() default "";
/**
* 枚举类导入、导出在excel中的分隔符号
* @return
*/
String spiteChar() default ",";
/**
* 单选 or 多选
* @return
*/
boolean single() default true;
}
很简单吧?就是通过自定义注解,把枚举类映射关系传递到注解的参数里面。目前这个实现方式是写死在代码里面的。如果说枚举映射都存在数据库中的话,可以对方法进行改造,枚举参数传递成数据库里面的分类标识,在转换器里面去获取数据库里对应的枚举内容。
上样例!
先写一个用户类
import com.alibaba.excel.annotation.ExcelProperty;
import com.example.test.excel.EasyExcelConvert;
import com.example.test.excel.EnumFiledConvert;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author 996
* @Date 2024/3/20
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExcelDto {
@ExcelProperty(value = "姓名")
private String name;
@ExcelProperty(value = "性别",converter = EasyExcelConvert.class)
@EnumFiledConvert(enumMap = "0-保密,1-男,2-女")
private Integer sex;
@ExcelProperty(value = "爱好",converter = EasyExcelConvert.class)
@EnumFiledConvert(enumMap = "1-篮球,2-足球,3-乒乓球,4-羽毛球",single = false)
private String hobbies;
}
建一个对象列表,模拟数据库查询出来的数据,测试导出是否成功转换。(该方法采用excel自动生成excel,也可以是使用fill填充的方式写入指定excel模板)
调用接口,查看Excel导出效果,一切正常:
再测试导入,直接将这个Excel提交,查看后台接收效果:
整体代码都比较简单,仅仅是提供一种思路去尽可能减少这种处理枚举转换上的无意义工作量,如果各位大佬有更好的意见,还请不吝赐教。