问题描述

现在需要使用 EasyExcel 的报表导入导出功能,一般的字段都没有问题,但是由于系统使用了 Spring Boot + Mybatis Plus 的枚举类型映射功能,所以类似于 性别 的字段,在实体类中是下面的形式。

@ExcelProperty(value = "性别(0:女,1:男)")
private GenderType gender;

其中的枚举类使用了 @EnumValue 注解,完成了自动映射,这使得在查询数据库的时候,我们和数据库交互的工具 Mybatis Plus 可以自动帮我们完成类型的封装和拆解;但是我们和 Excel 交互的工具 EasyExcel 默认并不具备这个功能,需要我们自己完成拆解和封装。

例如我们在 Excel 的性别字段中填写数字 1 表示的是枚举类型的性别 ,但是 EasyExcel 会认为要把数字类型的 1 转化为 枚举类型 GenderType,这样就会报错。

解决思路

既然默认不支持,就查阅文档,肯定预留了接口。文档地址:https://www.yuque.com/easyexcel/doc/easyexcel

文档
在这部分发现了预留的接口。

只需要继承 Converter 这个接口即可实现我们想要的功能。

最终实现

所以在这里写一个自己的实现类:

/**
 * Excel 性别类型装换器
 *
 * @author wang suo
 * @version 1.0
 * @date 2021/9/14 15:06
 */
@Slf4j
public class GenderTypeConverter implements Converter<GenderType> {

    @Override
    public Class supportJavaTypeKey() {
        return null;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return null;
    }

    @Override
    public GenderType convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 导入的时候直接导入数字即可 不用操作
        if (cellData.toString().equals("1")) {
            return GenderType.MAN;
        } else {
            return GenderType.WOMEN;
        }
    }

    /**
     * 将从数据库中查到的数据转换为 Excel 展示的数据
     *
     * @param value 枚举对象
     */
    @Override
    public CellData convertToExcelData(GenderType value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 将枚举类型按照 key 传值
        return new CellData(value.getKey().toString());
    }
}

其中:

  • convertToJavaData 是将 Excel 读取到的值转化为 Java 类型;
  • convertToExcelData 是将 Java 类型转为 Excel 中填写的值;

最后只需要在实体类性别字段上面的注解中增加一个属性即可:

/**
* 性别(0:女,1:男)
*/
@ExcelProperty(value = "性别(0:女,1:男)", converter = GenderTypeConverter.class)
private GenderType gender;
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐