FastExcel使用详解

文章目录

FastExcel使用详解

一、引言

FastExcel 是由原 EasyExcel 作者维护的高性能 Excel 处理库,专注于解决大规模数据读写时的内存溢出问题。它兼容 EasyExcel 的 API,同时新增了流式处理、读取指定行数、Excel 转 PDF 等功能,适用于企业级数据导入导出、报表生成等场景。本文将从环境配置、核心功能到实际应用示例,详细解析 FastExcel 的使用方法。


二、环境准备与依赖引入

1、Maven 依赖引入

pom.xml 中添加以下依赖:

xml 复制代码
<dependency>
    <groupId>cn.idev.excel</groupId>
    <artifactId>fastexcel</artifactId>
    <version>1.1.0</version>
</dependency>

2、实体类定义

通过 @ExcelProperty 注解实现 Excel 列与 Java 对象的映射:

java 复制代码
@Data
public class User {
    @ExcelProperty("编号")
    private Integer id;
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
}

说明 :使用 @Data(Lombok 注解)自动生成 Getter/Setter,简化代码。


三、核心操作:读写 Excel

1、读取 Excel

FastExcel 通过 事件监听器 实现流式读取,避免内存溢出。

1.1 自定义监听器
java 复制代码
public class UserReadListener implements ReadListener<User> {
    private List<User> dataList = new ArrayList<>();

    @Override
    public void invoke(User user, AnalysisContext context) {
        dataList.add(user); // 逐行处理数据
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("共读取 " + dataList.size() + " 条数据");
    }
}
1.2 读取文件
java 复制代码
String fileName = "users.xlsx";
FastExcel.read(fileName, User.class, new UserReadListener()).sheet().doRead();

2、写入 Excel

2.1 简单写入
java 复制代码
List<User> users = new ArrayList<>();
users.add(new User(1, "张三", 25));
users.add(new User(2, "李四", 30));

FastExcel.write("output.xlsx")
    .sheet("用户列表")
    .head(User.class)
    .doWrite(users);
2.2 模板写入

若需复杂格式,可基于模板填充数据:

java 复制代码
try (ExcelWriter writer = FastExcel.write("output.xlsx").withTemplate("template.xlsx").build()) {
    FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
    writer.fill(users, fillConfig, writerSheet);
}

四、Spring Boot 集成示例

1、文件上传(导入)

java 复制代码
@PostMapping("/upload")
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {
    try {
        UserReadListener listener = new UserReadListener();
        FastExcel.read(file.getInputStream(), User.class, listener).sheet().doRead();
        return ResponseEntity.ok("导入成功,数据量:" + listener.getDataList().size());
    } catch (IOException e) {
        return ResponseEntity.status(500).body("导入失败");
    }
}

2、文件下载(导出)

java 复制代码
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("Content-Disposition", "attachment;filename=users.xlsx");
    
    List<User> users = userService.listAll(); // 假设从数据库获取数据
    FastExcel.write(response.getOutputStream(), User.class)
        .sheet("用户数据")
        .doWrite(users);
}

五、总结

FastExcel 凭借其 高性能流式处理简洁的 API,成为处理大规模 Excel 数据的首选工具。相比传统库(如 Apache POI),其内存占用更低,特别适合百万级数据的导入导出。

适用场景

  • 企业级数据报表生成
  • 批量数据导入数据库
  • 高并发环境下的 Excel 处理

版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

相关推荐
草履虫建模10 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq12 小时前
分布式系统安全通信
开发语言·c++·算法
学嵌入式的小杨同学12 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
Re.不晚13 小时前
Java入门17——异常
java·开发语言
精彩极了吧13 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合
南极星100514 小时前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言
baidu_2474386114 小时前
Android ViewModel定时任务
android·开发语言·javascript
Dev7z14 小时前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab
不能隔夜的咖喱14 小时前
牛客网刷题(2)
java·开发语言·算法
小天源14 小时前
Error 1053 Error 1067 服务“启动后立即停止” Java / Python 程序无法后台运行 windows nssm注册器下载与报错处理
开发语言·windows·python·nssm·error 1053·error 1067