首页 > 编程语言 >Spring Boot3集成FastExcel实现百万级Excel导入(附源码)

Spring Boot3集成FastExcel实现百万级Excel导入(附源码)

时间:2025-01-22 16:44:38浏览次数:1  
标签:FastExcel return 读取 Spring Excel 源码 import public

什么是 FastExcel

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

FastExcel 的特点

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

主要特征

  • 高性能读写:FastExcel 专注于性能优化,能够高效处理大规模的 Excel 数据。相比一些传统的 Excel 处理库,它能显著降低内存占用。
  • 简单易用:该库提供了简洁直观的 API,使得开发者可以轻松集成到项目中,无论是简单的 Excel 操作还是复杂的数据处理都能快速上手。
  • 流式操作:FastExcel 支持流式读取,将一次性加载大量数据的问题降到最低。这种设计方式在处理数十万甚至上百万行的数据时尤为重要。

项目环境

  • Spring Boot: 3.4.x
  • FastExcel: 1.1.0
  • JDK: 17
  • Maven: 构建工具

引入依赖

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

配置FastExcel

FastExcel无需特别复杂的配置,直接通过依赖注入到Spring上下文即可。

代码示例

1、启动类

package com.example.fastexcel;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FastexcelApplication {
    public static void main(String[] args) {
        SpringApplication.run(FastexcelApplication.class, args);
    }
}

2、配置文件

application.yml

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

3、实体类

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

package com.example.fastexcel.entity;

import cn.idev.excel.annotation.ExcelProperty;

public class User {
    @ExcelProperty("编号")
    private Integer id;
    @ExcelProperty("名字")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

4、数据监听器

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

package com.example.fastexcel.listener;

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<>();

    //定义一个计数器
    private int count = 0;
    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        // 添加读取到的每一行数据到数据列表
        dataList.add(t);

        //计数器自增
        count++;
        if (count % 10000 == 0) {
            System.out.println("已读取 " + count + " 条数据");
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 读取完成后,打印数据列表的大小
        System.out.println("读取完成,共读取了 " + dataList.size() + " 条数据");
    }

    public List<T> getDataList() {
        return dataList;
    }

}

5、控制器

package com.example.fastexcel.controller;

import cn.idev.excel.FastExcel;
import com.example.fastexcel.entity.User;
import com.example.fastexcel.listener.BaseExcelListener;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

@Controller
public class ExcelController {


    /**
     * 导出Excel
     *
     * @param response
     * @throws IOException
     */
    @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");
        Long start = System.currentTimeMillis();
        // 写入数据
        FastExcel.write(response.getOutputStream(), User.class)
                .sheet("模板")
                .doWrite(buildData());
        Long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start));

    }

    /**
     * 导入Excel
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.badRequest().body("请选择一个文件上传!");
        }
        try {
            Long start = System.currentTimeMillis();
            BaseExcelListener<User> baseExcelListener = new BaseExcelListener<>();
            FastExcel.read(file.getInputStream(), User.class, baseExcelListener).sheet().doRead();
            List<User> dataList = baseExcelListener.getDataList();
            System.out.println(dataList.size());
            Long end = System.currentTimeMillis();
            return ResponseEntity.ok("文件上传并处理成功!耗时:" + (end - start) + "ms");
        } catch (IOException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件处理失败!");
        }
    }

    private List<User> buildData() {
        List<User> list = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            User user = new User();
            user.setId(i);
            user.setAge(88);
            user.setName("张三" + i);
            list.add(user);
        }
        return list;
    }
}

5、测试:

下载地址::http://127.0.0.1:8080/download
上传地址:127.0.0.1:8080/upload

下载地址直接复制即可
上传需要使用postMan等测试工具
参考:

6、总结

通过集成FastExcel,我们可以更高效地实现Excel文件的读写操作。它简单易用,性能优秀,是Spring Boot项目中处理Excel任务的理想选择。希望本文能为你在实际项目中应用FastExcel提供帮助!

源码地址:

https://github.com/Yning2333/SpringBoot3-LearningLabs
https://github.com/Yning2333/SpringBoot3-LearningLabs/tree/main/spring-boot3-fastexcel

标签:FastExcel,return,读取,Spring,Excel,源码,import,public
From: https://www.cnblogs.com/chengxuyuanxiaoyang/p/18686367

相关文章

  • DVWA靶场XSS漏洞通关教程及源码审计
    XSS漏洞XSS(跨站脚本攻击,Cross-SiteScripting)是一种安全漏洞,通常发生在Web应用程序中。XSS漏洞允许攻击者把恶意脚本注入到内容中,这会在其他用户的浏览器中执行。这种攻击可能导致用户会话被劫持、网站内容被修改、用户敏感信息被窃取等多种安全问题。常见的XSS类型包括:存......
  • 【开源】基于SpringBoot框架教学资料管理系统(计算机毕业设计)+万字毕业论文 T286
    系统合集跳转源码获取链接点击主页更能获取海量源码10年计算机开发经验,主营业务:源码获取、项目二开、语音辅导、远程调试、毕业设计、课程设计、毕业论文、BUG修改一、系统环境运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。IDE环境......
  • 【开源】基于SpringBoot框架智慧校园管理系统(计算机毕业设计)+万字毕业论文 T291
    系统合集跳转源码获取链接点击主页更能获取海量源码10年计算机开发经验,主营业务:源码获取、项目二开、语音辅导、远程调试、毕业设计、课程设计、毕业论文、BUG修改一、系统环境运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。IDE环境......
  • 【开源】基于SpringBoot框架汽车租赁系统(计算机毕业设计)+万字毕业论文 T296
    系统合集跳转源码获取链接点击主页更能获取海量源码10年计算机开发经验,主营业务:源码获取、项目二开、语音辅导、远程调试、毕业设计、课程设计、毕业论文、BUG修改一、系统环境运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。IDE环境......
  • 【Spring-WebFlux】
    SpringWebvsSpringWebflux:  https://medium.com/@burakkocakeu/spring-web-vs-spring-webflux-9224260c47b5     ......
  • spring-boot-starter-data-redis OutOfDirectMemoryError 堆外内存泄漏
    一、现象  起因:应用经常重启,JVM内存是比较稳定,查看错误日志发现是堆外内存泄漏,而且观看相关的trace,只有这个用户会导致OutOfDirectMemoryError继续排查现象查看redis出口流量远没有这么大查看对应堆栈的数据的key,也木有这么大。900KB左右(这个很大,也是促成现象的原......
  • 基于Spring Boot的私人西服定制系统
    一、技术框架后端开发框架:SpringBoot。这是一个基于Spring的快速开发框架,它简化了复杂的配置和依赖管理,帮助开发者快速构建稳定、高效的后端服务。前端开发框架:Vue。这是一款轻量、渐进式的前端框架,适合构建动态的用户界面和单页应用(SPA)。数据库:MySQL,作为系统数据储存平......
  • 基于Spring Boot的校园二手书籍交易平台
    一、系统概述校园二手书籍交易平台旨在满足校园内学生对于二手书籍交易的需求,通过平台学生可以发布自己的二手书籍信息,浏览和搜索其他同学的书籍,与卖家进行沟通交流,并完成交易等操作。该平台不仅有助于缩小社会阅读差距、促进阅读普及,还能有效推动阅读文化的传播,对社会的知......
  • 基于springboot高校校外实训基地管理系统
    一、系统背景与意义随着高校教育的不断发展,校外实训基地已成为学生实践教学的重要环节。然而,传统的实训基地管理方式存在诸多问题,如信息记录不完整、管理流程繁琐、沟通不畅等,这些问题严重影响了实训基地的使用效率和学生的实践效果。因此,开发一个高效、便捷的实训基地管理......
  • 【spring原理】AOP面向切面编程
    Spring中的AOP(Aspect-OrientedProgramming,面向切面编程)是一种通过分离关注点来增强代码模块化的编程范式。在Spring中,AOP允许开发者定义通用的行为(如日志记录、安全性验证、事务管理等),然后以非侵入的方式将这些行为应用到应用程序的特定部分(例如方法或类)上,从而避免代码重......