当前位置: 首页 > article >正文

FastExcel 新一代的潮流 (EasyExcel)

目录

简介

FastExcel的特点

FastExcel使用方法详解

创建实体类和监听器

实现写入和读取功能

Excel转换为PDF

小结

FastExcel与EasyExcel的区别

结论

简介

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

FastExcel的特点

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

FastExcel使用方法详解

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

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

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

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文件中。

// 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文件,并使用之前创建的监听器来处理读取到的数据。

// 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时需要确保符合其许可证要求。

FastExcel.convertToPdf(new File("excelFile"),new File("pdfFile"),null,null);
小结

FastExcel作为一个高效且易于使用的Excel处理工具,不仅继承了EasyExcel的所有优点,还在此基础上进行了性能和功能的增强。

通过上述示例,我们可以看到FastExcel如何简化Excel文件的读写操作,以及如何通过事件监听器实现流式处理,从而有效管理内存使用。无论是企业数据导入导出还是个人项目开发,FastExcel都能提供强大的支持。

FastExcel与EasyExcel的区别

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

结论

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

觉得有用的话可以点点赞 (*/ω\*),支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦 >人< 。


http://www.kler.cn/a/512269.html

相关文章:

  • 蓝桥杯小白备考指南
  • ingress-nginx代理tcp使其能外部访问mysql
  • Mac下安装ADB环境的三种方式
  • Python文本处理:LDA主题聚类模型
  • 简述mysql 主从复制原理及其工作过程,配置一主两从并验证。
  • 内存故障原因与诊断(Reasons and Diagnosis of Memory Failure)
  • [操作系统] 进程的调度
  • 从零开始解决ubuntu2204,pcl-1.8 编译中报错的问题,cmake-gui编译
  • 20250120 Flink 中的 Rescaling 算子
  • [微服务]注册中心优化
  • LeetCode 2661. First Completely Painted Row or Column
  • Android studio开发实战之碎片Fragment
  • 免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)
  • 如何在C#中处理控件无法执行Invoke或BeginInvoke的情况
  • 多级缓存 JVM进程缓存
  • 【useCallback Hook】在多次渲染中缓存组件中的函数,避免重复创建函数
  • iOS中的设计模式(三)- 工厂方法
  • 分布式系统架构7:本地缓存
  • CSS 实体
  • 第11章:Python TDD实现货币类加法运算初步
  • 深入HDFS——HA和QJM
  • 4.1 AI 大模型应用最佳实践:如何提升 GPT 模型使用效率与质量
  • MySQL多表查询练习
  • 数据库性能优化(sql优化)_SQL执行计划01_yxy
  • 【数据结构篇】顺序表 超详细
  • 从一到无穷大 #42:ClickHouse - 极致工程优化的Lightning Fast Analytics