EasyExcel 导出字段踩坑

问题 1:数组类型错误

报错

com.alibaba.excel.exception.ExcelWriteDataConvertException: Can not find 'Converter' support class List.

原因

EasyExcel Converter 接口的convertToExcelData只实现了转换 BigDecimal、Bolean、Byte[]、btye[]、Byte、Date、Double、File、Float、InputStream、Integer、Long、Short、URL 这些类型,意味着参数 data 最多只能是个二维数据,当需要转换 List、List 时就会无法转换报错

解决:补充转化器

@Component
public class ListConvert implements Converter<List> {
    @Override
    public WriteCellData<?> convertToExcelData(List value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        StringBuilder stringBuilder = new StringBuilder();
        value.forEach(o -> stringBuilder.append(o).append(","));
        return new WriteCellData<>(CellDataTypeEnum.STRING, stringBuilder.toString());
    }

    @Override
    public List convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        return new ArrayList<>(Arrays.asList(cellData.getStringValue().split(",")));
    }

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

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
}
    @Schema(description = "方案ID")
    @ExcelProperty(value = "方案ID", converter = ListConvert.class)
    private List<Long> bizPlanIds;

问题 2:日期类型未正常显式

问题描述

导出后 Excel 文件日期列 显示 ############,手动调整单元格类型为日期后正常显示内容

解决:补充转换器

package com.tbit.cloud.framework.excel.core.convert;

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.stereotype.Component;

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

@Component
public class LocalDateTimeConvert implements Converter<LocalDateTime> {

    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public WriteCellData<?> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        if (value == null) {
            return new WriteCellData<>(CellDataTypeEnum.STRING, "");
        }
        // 格式化 LocalDateTime 为字符串
        String formattedDate = value.format(DATE_TIME_FORMATTER);
        return new WriteCellData<>(CellDataTypeEnum.STRING, formattedDate);
    }

    @Override
    public LocalDateTime convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        String dateString = cellData.getStringValue();
        // 转换字符串为 LocalDateTime
        return LocalDateTime.parse(dateString, DATE_TIME_FORMATTER);
    }

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

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
}
    @Schema(description = "登录时间", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty(value = "登录时间", converter = LocalDateTimeConvert.class)
    private LocalDateTime createTime;
posted @ 2025-02-21 11:31  YaosGHC  阅读(1625)  评论(0)    收藏  举报