EasyExcel 自定义枚举类型装换

问题描述

现在需要使用 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;
### 实现 EasyExcel 自定义列宽 为了实现在 EasyExcel自定义设置列宽的功能,可以通过编写监听器来控制 Excel 文件写入过程中的样式和格式。具体来说,在 `WriteHandler` 接口中实现了 `ColumnWidthStyleStrategy` 类用于处理列宽。 当创建一个新的工作簿时,通过调用 `EasyExcel.write()` 方法并链式调用 `.registerWriteHandler(new ColumnWidthStyleStrategy())` 来注册该策略类[^1]。 下面是一个简单的例子展示如何利用此方法来自定义每一列的宽度: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.handler.AbstractCellWriteHandler; public class CustomColumnWidthExample { public static void main(String[] args) { String fileName = "custom_column_width.xlsx"; // 注册列宽处理器 EasyExcel.write(fileName) .registerWriteHandler(new ColumnWidthStyleStrategy()) .sheet("Sheet1") .doWrite(data()); } private static List<List<String>> data() { List<List<String>> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { List<String> row = Arrays.asList("data" + i, "test" + i); list.add(row); } return list; } } ``` 在这个案例里,`ColumnWidthStyleStrategy` 是一个内部静态类或者是单独的一个类文件,它继承了 `AbstractCellStyleStrategy` 并重写了其中的方法以适应特定需求下的单元格样式调整逻辑,包括但不限于设定不同列的不同宽度[^2]。 对于更复杂的场景,比如基于某些条件动态改变某几列的宽度,则可以在上述基础上进一步扩展 `ColumnWidthStyleStrategy` 的功能,使其能够接收外部参数或根据业务规则灵活修改列宽属性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕子鸽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值