首页 > 其他分享 >干掉EasyExcel!FastExcel初体验

干掉EasyExcel!FastExcel初体验

时间:2024-12-23 22:56:47浏览次数:10  
标签:FastExcel 初体验 读取 EasyExcel Excel User import

我们知道 EasyExcel 在作者从阿里离职之后就停止维护了,但在前两周 EasyExcel 原作者推出了他的升级版框架 FastExcel。以下是 FastExcel 的上手实战过程,带大家一起提供新框架的魅力。

FastExcel 是由原 EasyExcel 作者创建的最新作品,作者在 2023 年从阿里离职后,随着阿里宣布停止更新 EasyExcel,所以他就决定继续维护和升级这个项目。在重新开始时,作者为它起名为 FastExcel,以突出这个框架在处理 Excel 文件时的高性能表现,而不仅仅是简单易用。

FastExcel 仍是免费的开源框架,它具备以下特点:

  1. 完全兼容原 EasyExcel 的所有功能和特性,这使得用户可以无缝过渡。
  2. 从 EasyExcel 迁移到 FastExcel 只需简单地更换包名和 Maven 依赖即可完成升级。
  3. 在功能上,比 EasyExcel 提供更多创新和改进。
  4. FastExcel 1.0.0 版本新增了读取 Excel 指定行数和将 Excel 转换为 PDF 的功能。

FastExcel 具体使用如下。

FastExcel 使用

1.1 添加依赖

<dependency>
  <groupId>cn.idev.excel</groupId>
  <artifactId>fastexcel</artifactId>
  <version>1.0.0</version> <!-- 请确保使用最新版本 -->
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>

1.2 创建实体类和监听器

1.2.1 创建实体类

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;
}

1.2.2 创建事件监听器

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> {
    // 用于存储读取到的Excel数据对象列表
    private List<T> dataList = new ArrayList<>();
    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        // 每读取一行数据,就将其添加到dataList中
        dataList.add(t);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 当所有数据读取完成后,可以在这里进行一些后续操作,如打印读取到的数据数量
        System.out.println("读取完成,共读取了 " + dataList.size() + " 条数据");
    }
    // 提供一个方法用于获取存储数据的列表
    public List<T> getDataList() {
        return dataList;
    }
}

1.3 实现写入和读取功能

1.3.1 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 测试数据
    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);
}

以上代码执行效果如下:

1.3.2 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("文件处理失败!");
    }
}

以上代码执行效果如下:

EasyExcel 如何升级到FastExcel

2.1 修改依赖

将 EasyExcel 的依赖替换为 FastExcel 的依赖,如下:

<!-- easyexcel 依赖 -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>xxxx</version>
</dependency>

依赖替换为:

<dependency>
  <groupId>cn.idev.excel</groupId>
  <artifactId>fastexcel</artifactId>
  <version>1.0.0</version>
</dependency>

2.2 修改代码

将 EasyExcel 的包名替换为 FastExcel 的包名,如下:

// 将 easyexcel 的包名替换为 FastExcel 的包名
import com.alibaba.excel.**;

替换为

import cn.idev.excel.**;

Excel转换为PDF

FastExcel 支持将 Excel 文件转换为 PDF 文件,FastExcel 将 Excel 转为Pdf 底层依赖于 Apache POI 和 itext-pdf。受限于 itext-pdf 的许可证,请确保您的使用符合 itext-pdf 的许可证,后续 FastExcel 将支持更多的 PDF 转换功能替换 itext-pdf,实现代码如下:

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

小结

FastExcel 依然是原来的那个 EasyExcel,但又不完全是 EasyExcel,希望 FastExcel 越做越好。各位小伙伴们,一起体验起来吧。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列等模块。

标签:FastExcel,初体验,读取,EasyExcel,Excel,User,import
From: https://www.cnblogs.com/vipstone/p/18625204

相关文章

  • WebUSB 初体验:让你的设备插上飞翔的翅膀
    "谁能想到,浏览器居然能直接管USB?科技这碗饭,越来越难吃了!"什么是WebUSB?WebUSB是一项让浏览器直接与USB设备通信的技术,旨在缩短开发者和设备间的距离。无需安装驱动,无需依赖复杂的桌面软件,直接通过JavaScript和USB设备交互。是不是听起来很酷?但别着急,这背后还有不少坑......
  • FastExcel 合并单元格(相当的行数据,进行合并)
    目录需求思路实现Excel导出单元格全量合并策略日期格式转换接口代码ServiceDTO使用FastExcel数据导出:官网:https://idev.cn/fastexcel/zh-CN需求信用代码、填报人,唯一时,将:信用代码、单位名称、填报人,进行row合并,并垂直居中对齐思路这边不需要做列合并,所以采用了RowWrite......
  • EasyExcel 相同和自动合并
    1.excel模版  2.自动合并代码importcom.alibaba.excel.metadata.Head;importcom.alibaba.excel.write.merge.AbstractMergeStrategy;importorg.apache.poi.ss.usermodel.*;importorg.apache.poi.ss.util.CellRangeAddress;importjava.util.*;publicclassOpti......
  • EasyExcel => FastExcel ,导入导出支持多种时间格式
    InfoExcelDTO/***合作开始日期**/@ExcelProperty(index=22,converter=ExcelDateConverter.class)privateDatecooperationDate;ExcelDateConverterpackagecom.vipsoft.base.util;importjava.text.SimpleDateFormat;importjava.time.LocalDate;importjava......
  • 01、vue2初体验
    一、Vue程序初体验先不去了解Vue框架的发展历史,Vue框架的特点,Vue的作者,这些对于我们开发来说,没有什么特别的作用,我们先学会基本使用,然后再去详细了解它的特点,就会发现,原来如此。但我们需要指导Vue是一个基于JavaScript(JS)实现的框架,想要使用它,就得先拿到Vue的js文件Vue官网......
  • 软件开发 --- redis 之初体验
    一个键值对(Key-Value)的内存数据库可以用作数据库缓存、消息队列、排行榜等场景。 快速上手Redis默认有16个数据库(索引从0到15),但所有命令默认都会在数据库0中执行,除非你显式地使用SELECT命令来切换到其他数据库。安装  1.数据缓存:快速存取热点数据Redis常......
  • 基于 easyExcel 3.1.5依赖的包 实现动态表头 动态表格内容
    1.需求:需要导出的EXCEL示例: 2.依赖:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.5</version></dependency>3.工具类:package......
  • EasyExcel => EasyExcel-Plus => FastExcel
    https://github.com/CodePhiliaX/fastexcelhttps://github.com/CodePhiliaX/fastexcel-dochttps://mvnrepository.com/artifact/cn.idev.excel/fastexcel@psxjoy:还在为第一版的正式发布而努力。文档方面,我们已经完成了第一版的内容。会随着第一个正式版本同时发布。什么是F......
  • 使用EasyExcel实现excel文件导入导出(附实战)
    什么是EasyExcelEasyExcel是一个由阿里巴巴开源的Java库,专注于处理大数据量的Excel文件读写操作。它以高性能、低内存占用和简单易用著称,特别适合处理大规模数据。EasyExcel通过异步处理和NIO技术优化了读写性能,同时提供了丰富的API和注解支持,使得数据导入导出变得简单快捷。......
  • C 语言学习心得:编程世界的初体验与成长
    学习C语言的过程就像是一场充满挑战与惊喜的冒险。从最初接触到它神秘而严谨的语法结构,到逐渐能够运用它构建出具有各种功能的程序,这期间我经历了困惑、沮丧,更收获了满满的成就感,深刻体会到了编程的魅力与艰辛。 C语言简洁而高效的特性犹如一把双刃剑。一方面,它给予了程......