Skip to content

Excel 文件处理模块(FastExcel实现)

最后更新: 5 分钟前
实践版本: v2.13.0

简介

continew-starter-excel-fastexcel 是 ContiNew Starter 提供的基于 FastExcel 实现的 Excel 文件处理模块,提供开箱即用的 Excel 导入导出解决方案。FastExcel 是一个基于 Java 的快速、简洁、解决大文件内存溢出的 Excel 处理工具,专为大数据量 Excel 文件处理而设计。

主要特性

  • 高性能处理: 基于 FastExcel 实现,支持大数据量 Excel 文件的高效处理,有效避免内存溢出
  • 简洁易用: 提供简单易用的工具类 ExcelUtils,一行代码即可完成 Excel 导出
  • 智能转换: 内置多种数据类型转换器,支持大数值、枚举、集合等复杂数据类型的自动转换
  • 样式优化: 自动适配列宽,提供良好的 Excel 文件显示效果
  • 注解支持: 集成 Excel 注解,支持字段映射、排序、验证等功能

使用步骤

引入依赖

pom.xml 中添加以下依赖:

xml
<dependency>
    <groupId>top.continew.starter</groupId>
    <artifactId>continew-starter-excel-fastexcel</artifactId>
</dependency>

核心工具类

ExcelUtils

Excel 工具类,提供简洁的导出方法:

java
public class ExcelUtils {
    
    /**
     * 导出(简单版本)
     *
     * @param list     导出数据集合
     * @param fileName 文件名
     * @param clazz    导出数据类型
     * @param response 响应对象
     */
    public static <T> void export(List<T> list, String fileName, Class<T> clazz, HttpServletResponse response);
    
    /**
     * 导出(完整版本)
     *
     * @param list                    导出数据集合
     * @param fileName                文件名
     * @param sheetName               工作表名称
     * @param excludeColumnFieldNames 排除字段
     * @param clazz                   导出数据类型
     * @param response                响应对象
     */
    public static <T> void export(List<T> list,
                                  String fileName,
                                  String sheetName,
                                  Set<String> excludeColumnFieldNames,
                                  Class<T> clazz,
                                  HttpServletResponse response);
}

ExcelUtils 默认使用 LongestMatchColumnWidthStyleStrategy 自动适配列宽:

java
FastExcelFactory.write(response.getOutputStream(), clazz)
    .autoCloseStream(false)
    // 自动适配宽度
    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
    // 自动转换大数值
    .registerConverter(new ExcelBigNumberConverter())
    .sheet(sheetName)
    .excludeColumnFieldNames(excludeColumnFieldNames)
    .doWrite(list);

数据类型转换器

ExcelBigNumberConverter

大数值转换器,解决 Excel 中超过 15 位数字的精度问题:

java
/**
 * Excel 大数值转换器
 * <p>
 * Excel 中对长度超过 15 位的数值输入是有限制的,从 16 位开始无论录入什么数字均会变为 0,
 * 因此输入时只能以文本的形式进行录入
 * </p>
 */
public class ExcelBigNumberConverter implements Converter<Long> {
    
    /**
     * Excel 输入数值长度限制
     */
    private static final int MAX_LENGTH = 15;
    
    @Override
    public Class<Long> supportJavaTypeKey() {
        return Long.class;
    }
    
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
    
    // 实现转换逻辑...
}

ExcelBaseEnumConverter

枚举转换器,支持 BaseEnum 接口的枚举类型:

java
/**
 * Excel 枚举接口转换器
 */
public class ExcelBaseEnumConverter implements Converter<BaseEnum<?>> {
    
    @Override
    public Class<BaseEnum> supportJavaTypeKey() {
        return BaseEnum.class;
    }
    
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
    
    // 实现转换逻辑...
}

ExcelListConverter

集合转换器,支持 List 类型与逗号分隔字符串的转换:

java
/**
 * Excel List 集合转换器
 * <p>
 * 仅适合 List<基本类型> <=> xxx,xxx 转换
 * </p>
 */
@Component
public class ExcelListConverter implements Converter<List> {
    
    @Override
    public Class supportJavaTypeKey() {
        return List.class;
    }
    
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
    
    // 实现转换逻辑...
}

核心依赖

依赖描述
top.continew.starter:continew-starter-excel-coreExcel 文件处理模块 - 核心模块
cn.idev.excel:fastexcelFastExcel(基于 Java 的快速、简洁、解决大文件内存溢出的 Excel 处理工具)