问题引出

狗子我在参与一个项目的时候接触到数据表格导出为Excel表格的需求,但是在导出的时候会出现报错 Cannot find ‘Converter’ support class LocalDateTime,原因是我需要导出的实体类中存在 LocalDateTime 类型的属性,而又恰巧 EasyExcel 不支持 LocalDate 和 LocalDateTime 接收数据,啊人生

image-20220325001518501

解决方案

在寻找了多篇文章之后,在下面对这个问题进行总结,既然默认不支持我使用这个类型,那就杀出一条路来。

首先先来看报的错误提示:Cannot find ‘Converter’ support class LocalDateTime,明显可以看出来是找不到 LocalDateTime 的一个 Converter,那么这个所谓的 Converter 到底是个什么东西呢?既然他缺少这个东西我们能不能给他自己弄一个上去呢?说干就干!(其实解决方法也真就是这个)

自定义Converter

Converter 在这里其实是一个字段转换器,在 EasyExcel 中担任将Java属性转换成Excel表格中合法数据的一个小东西。由于EasyExcel自己没有我们需要的 LocalDateTime 的字段转换器,那我们就自己搞一个出来。在 config 包下新建一个自定义的字段转换器 LocalDateTimeConverter 。

package edu.lingnan.rili.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author xBaozi
 * @version 1.0
 * @classname LocalDateTimeConverter
 * @description EasyExcel LocalDateTime转换器
 * @date 2022/3/19 2:17
 */

public class LocalDateTimeConverter implements Converter<LocalDateTime> {
    private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";

    @Override
    public Class<LocalDateTime> supportJavaTypeKey() {
        return LocalDateTime.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
                                           GlobalConfiguration globalConfiguration) {
        return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern(DEFAULT_PATTERN));
    }

    @Override
    public CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) {
        return new CellData<>(value.format(DateTimeFormatter.ofPattern(DEFAULT_PATTERN)));
    }
}

引用 LocalDateTimeConverter

既然这东西是本来没有然后我们自己弄出来的,那肯定要告诉程序:**诶!这里我给你生了个崽,要记得领回去啊!**所以,我们在原本需要导出的 LocalDateTime 类型中的 @ExcelProperty 注解中引入自定义的字段转换器。

同时要加上一个JsonFormat的格式化注解,将该属性转换成 json格式,这里要注意的就是要导入一下阿里巴巴的 fastjson Maven坐标了。

@ExcelProperty(value = "操作时间", index = 8, converter = LocalDateTimeConverter.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("操作时间")
private LocalDateTime operationTime;
<!-- fastjson的Maven坐标 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>

搞定收工

好啦!到这里我们遇到的问题就已经解决了呀!虽然说前期刚遇到这个问题的时候一直在被折磨,但是却是一个很好的一个提升机会,没点儿bug,怎么能保得住头发呢是吧。

image-20220325004021570

Logo

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

更多推荐