FastExcel:超越EasyExcel的新一代Excel处理工具

简介

FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有优点,并且在性能和功能上进行了显著的提升和创新。

FastExcel的特点

  1. 高性能读写:FastExcel专注于性能优化,能够高效处理大规模的Excel数据,显著降低内存占用。
  2. 简单易用:提供了简洁直观的API,使得开发者可以轻松集成到项目中,无论是简单的Excel操作还是复杂的数据处理都能快速上手。
  3. 流式操作:支持流式读取,将一次性加载大量数据的问题降到最低,特别适合处理数十万甚至上百万行的数据。
  4. 完全兼容:完全兼容原EasyExcel的所有功能和特性,用户可以无缝过渡。
  5. 持续更新:FastExcel会持续更新,修复bug,优化性能,增加新功能。

FastExcel使用方法详解

创建实体类和监听器
创建实体类

在使用FastExcel进行Excel文件的读写操作之前,需要定义一个实体类,该类中的每个属性对应Excel中的一列。使用@ExcelProperty注解来指定列名。

java 复制代码
/**
 * @author 作者:TesterRoad
 * @time 创建时间:2024
 * @desc 公众号:测试工程师成长之路
 */
 
import cn.idev.excel.annotation.ExcelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
public class User {
    @ExcelProperty("编号")
    private Integer id;
    @ExcelProperty("名字")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
}
创建事件监听器

FastExcel通过事件监听器实现Excel文件的逐行读取,这对于处理大文件尤为重要,因为它可以避免内存溢出的问题。下面是一个事件监听器的示例,它在读取每行数据时将数据添加到列表中,并在所有数据读取完成后执行一些操作。

java 复制代码
/**
 * @author 作者:TesterRoad
 * @time 创建时间:2024
 * @desc 公众号:测试工程师成长之路
 */
 
import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;

public class BaseExcelListener<T> extends AnalysisEventListener<T> {
    private List<T> dataList = new ArrayList<>();

    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        dataList.add(t);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("读取完成,共读取了 " + dataList.size() + " 条数据");
    }

    public List<T> getDataList() {
        return dataList;
    }
}
实现写入和读取功能
Excel写入功能

以下是使用FastExcel进行Excel写入的示例代码。首先,创建测试数据,然后通过FastExcel.write方法将数据写入到Excel文件中。

java 复制代码
/**
 * @author 作者:TesterRoad
 * @time 创建时间:2024
 * @desc 公众号:测试工程师成长之路
 */
 
// Excel写入功能
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setCharacterEncoding("utf-8");
    String fileName = URLEncoder.encode("test", "UTF-8");
    response.setHeader("Content-disposition",
                       "attachment;filename*=utf-8''" + fileName + ".xlsx");
    // 写入数据
    FastExcel.write(response.getOutputStream(), User.class)
    .sheet("模板")
    .doWrite(buildData());
}

// 创建测试数据
private List<User> buildData() {
    User user1 = new User();
    user1.setId(1);
    user1.setName("张三");
    user1.setAge(18);
    User user2 = new User();
    user2.setId(2);
    user2.setName("李四");
    user2.setAge(19);
    return List.of(user1, user2);
}
Excel读取功能

以下是使用FastExcel进行Excel读取的示例代码。通过FastExcel.read方法读取Excel文件,并使用之前创建的监听器来处理读取到的数据。

java 复制代码
/**
 * @author 作者:TesterRoad
 * @time 创建时间:2024
 * @desc 公众号:测试工程师成长之路
 */
 
// Excel读取功能
@PostMapping("/upload")
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {
    if (file.isEmpty()) {
        return ResponseEntity.badRequest().body("请选择一个文件上传!");
    }
    try {
        BaseExcelListener<User> baseExcelListener = new BaseExcelListener<>();
        FastExcel.read(file.getInputStream(), User.class, baseExcelListener).sheet().doRead();
        List<User> dataList = baseExcelListener.getDataList();
        System.out.println(dataList);
        return ResponseEntity.ok("文件上传并处理成功!");
    } catch (IOException e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件处理失败!");
    }
}
Excel转换为PDF

FastExcel还支持将Excel文件转换为PDF文件,这一功能底层依赖于Apache POI和itext-pdf。请注意,使用itext-pdf时需要确保符合其许可证要求。

java 复制代码
FastExcel.convertToPdf(new File("excelFile"),new File("pdfFile"),null,null);
小结

FastExcel作为一个高效且易于使用的Excel处理工具,不仅继承了EasyExcel的所有优点,还在此基础上进行了性能和功能的增强。通过上述示例,我们可以看到FastExcel如何简化Excel文件的读写操作,以及如何通过事件监听器实现流式处理,从而有效管理内存使用。无论是企业数据导入导出还是个人项目开发,FastExcel都能提供强大的支持。

FastExcel与EasyExcel的区别

  1. 性能提升:FastExcel在性能上比EasyExcel更好,更稳定。
  2. API一致性:FastExcel与EasyExcel的API完全一致,可以无缝切换。
  3. 功能增加:FastExcel 1.0.0版本新增了读取Excel指定行数和将Excel转换为PDF的功能。

结论

FastExcel作为一个轻量级但功能强大的Java库,专为需要高性能和低内存占用的Excel文件处理而设计。如果您的项目需要处理大规模的Excel数据,FastExcel无疑是一个值得考虑的选择。其流式处理和灵活的API使其成为处理Excel文件的理想工具。

来源:https://juejin.cn/post/7451871895753326626

相关推荐
珹洺1 小时前
C++从入门到实战(十)类和对象(最终部分)static成员,内部类,匿名对象与对象拷贝时的编译器优化详解
java·数据结构·c++·redis·后端·算法·链表
一 乐1 小时前
网红酒店|基于java+vue的网红酒店预定系统(源码+数据库+文档)
java·开发语言·数据库·毕业设计·论文·springboot·网红酒店预定系统
xyliiiiiL3 小时前
从责任链模式聊到aware接口
java·开发语言
影子24016 小时前
Navicat导出mysql数据库表结构说明到excel、word,单表导出方式记录
数据库·mysql·excel
码农老起6 小时前
与Aspose.pdf类似的jar库分享
java·pdf·jar
程序猿小D6 小时前
第三百八十九节 JavaFX教程 - JavaFX WebEngine
java·eclipse·intellij-idea·vr·javafx
self-discipline6348 小时前
【Java】Java核心知识点与相应面试技巧(七)——类与对象(二)
java·开发语言·面试
wei3872452328 小时前
java笔记02
java·开发语言·笔记
zjj5879 小时前
Docker使用ubuntu
java·docker·eureka
士别三日&&当刮目相看9 小时前
JAVA学习*简单的代理模式
java·学习·代理模式