Java SpringBoot使用EasyExcel导入导出Excel文件

news2025/1/6 13:13:25

点击下载《Java SpringBoot使用EasyExcel导入导出Excel文件(源代码)》

在 Java Spring Boot 项目中,导入(读取)和导出(写入) Excel 文件是一项常见的需求。EasyExcel 是阿里巴巴开源的一个用于简化 Java 环境下 Excel 文件读取和写入操作的库。相比于传统的 Apache POI,EasyExcel 在性能和易用性方面进行了优化,特别适用于处理大规模 Excel 文件。

1. EasyExcel 介绍

1.1 EasyExcel 的特点

特性/方面详细说明
基于事件驱动的解析采用 SAX 解析方式,通过事件驱动逐行读取 Excel 数据,避免将整个文件加载到内存中,降低内存消耗。
内存友好由于逐行读取和处理数据,内存占用极低,适合处理大型 Excel 文件,避免内存溢出问题。
简洁易用的 API提供高度封装的 API,通过注解(如 @ExcelProperty)轻松实现 Java 对象与 Excel 列的映射,减少样板代码的编写。
支持多种数据格式支持常见的 Excel 数据格式,包括 .xlsx.xls 文件,并支持自定义数据格式转换。
丰富的功能支持读取和写入 Excel 文件、自定义转换器、多工作表操作、注解支持、异常处理等。
高性能在处理大规模数据时表现出色,能够显著提高数据导入和导出的效率。
社区活跃作为阿里巴巴开源项目,拥有活跃的社区和及时的更新,能够及时修复问题和添加新功能。
依赖其他库依赖于 cglib 和其他一些库,如果项目中已经使用了不同版本的这些库,可能会导致版本冲突。
学习曲线虽然 API 简洁,但对于不熟悉事件驱动编程或注解映射的开发者,可能需要一定的学习成本。
功能相对有限与 Apache POI 相比,EasyExcel 对公式、图表、样式等复杂功能的支持相对较少。
灵活性高支持自定义数据转换器、多工作表操作等功能,提供了高度的灵活性以满足不同的业务需求。

1.2 EasyExcel 的优点

优点详细说明
内存效率高采用事件驱动和逐行读取的方式,内存占用低,适合处理大型 Excel 文件,避免内存溢出问题。
性能优越在处理大规模数据时具有更高的性能,能够显著减少处理时间,提高数据导入和导出效率。
易用性强通过简洁的 API 和注解支持,简化了 Excel 数据的读取和写入操作,减少了代码量,提高了开发效率。
灵活性高支持自定义数据转换器、多工作表操作等功能,能够满足不同的业务需求。
社区支持作为开源项目,拥有活跃的社区和及时的更新,能够及时响应用户需求和问题。

1.3 EasyExcel 的缺点

缺点详细说明
功能相对有限与 Apache POI 相比,EasyExcel 对公式、图表、样式等复杂功能的支持较少。
依赖其他库依赖于 cglib 和其他一些库,可能导致版本冲突,需要注意依赖管理。
学习曲线对于不熟悉事件驱动编程或注解映射的开发者,可能需要一定的学习成本。
社区规模虽然拥有活跃的社区,但与 Apache POI 相比,社区规模相对较小,可能在某些情况下获取帮助的渠道相对有限。

2. EasyExcel使用

2.1 引入 EasyExcel 依赖

首先,需要在 pom.xml 中引入 EasyExcel 的依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- EasyExcel 依赖 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel-core</artifactId>
        <version>3.1.2</version>
    </dependency>

    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.3.0</version> <!-- 请检查最新版本 -->
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </dependency>

    <!-- 其他依赖 -->
</dependencies>

2.2 定义数据模型

使用 EasyExcel 导入导出数据时,需要定义与 Excel 列对应的 Java 类,并使用注解标注列信息。

package com.yyqq.exceldemo.model;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class UserData {

    @ExcelProperty("编号") // Excel 中的列名
    private Integer id;

    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("年龄")
    private Integer age;

    @ExcelProperty("邮箱")
    private String email;
}


说明

  • @Data:Lombok 提供的注解,用于自动生成 getter、setter、toString 等方法。
  • @ExcelProperty:指定 Excel 中对应的列名。

2.3 Excel 导入导出Controller类

package com.yyqq.exceldemo.controller;

import com.alibaba.excel.EasyExcel;
import com.yyqq.exceldemo.model.UserData;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@RestController
public class ExcelController {

    /**
     * 导入execl文件
     */
    @GetMapping("/export")
    public ResponseEntity<byte[]> exportExcel() {
        String fileName = "用户数据.xlsx";
        List<UserData> userList = generateUserData();

        // EasyExcel 写入到字节数组
        byte[] bytes = exportToExcel(userList);

        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", fileName);

        return ResponseEntity.ok()
                .headers(headers)
                .body(bytes);
    }

    @PostMapping("/import")
    public String importExcel(@RequestParam("file") MultipartFile file) {
        try {
            InputStream inputStream = file.getInputStream();
            // 使用 EasyExcel 读取 Excel 数据
            List<UserData> userList = EasyExcel.read(inputStream)
                    .head(UserData.class)
                    .sheet()
                    .doReadSync();

            // 处理导入的数据,例如保存到数据库
            processUserData(userList);

            return "导入成功,共导入 " + userList.size() + " 条数据";
        } catch (Exception e) {
            e.printStackTrace();
            return "导入失败: " + e.getMessage();
        }
    }

    /**
     * 模拟生产用户数据
     * @return
     */
    private List<UserData> generateUserData() {
        List<UserData> list = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            UserData user = new UserData();
            user.setId(i);
            user.setName("用户" + i);
            user.setAge(20 + i % 30);
            user.setEmail("user" + i + "@example.com");
            list.add(user);
        }
        return list;
    }

    /**
     * 将数据导出至byte数组中
     */
    private byte[] exportToExcel(List<UserData> userList) {
        // 使用 EasyExcel 写入 Excel 到字节数组
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        EasyExcel.write(out, UserData.class)
                .sheet("用户数据")
                .doWrite(userList);
        return out.toByteArray();
    }

    /**
     * 导入数据方法
     */
    private List<UserData> importFromExcelWithPOI(MultipartFile file) {
        List<UserData> userList = new ArrayList<>();
        try (InputStream inputStream = file.getInputStream();
             Workbook workbook = WorkbookFactory.create(inputStream)) {
            Sheet sheet = workbook.getSheetAt(0);
            Iterator<Row> iterator = sheet.iterator();

            // 跳过表头
            if (iterator.hasNext()) {
                iterator.next();
            }

            while (iterator.hasNext()) {
                Row row = iterator.next();
                UserData user = new UserData();
                user.setId((int) row.getCell(0).getNumericCellValue());
                user.setName(row.getCell(1).getStringCellValue());
                user.setAge((int) row.getCell(2).getNumericCellValue());
                user.setEmail(row.getCell(3).getStringCellValue());
                userList.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return userList;
    }

    private void processUserData(List<UserData> userList) {
        // 这里可以添加将数据保存到数据库的逻辑
        // 例如使用 JPA 或 MyBatis 等持久层框架
        userList.forEach(user -> {
            // 模拟保存操作
            System.out.println("保存用户: " + user);
        });
    }
}

export导出接口说明

  • 导出接口/export 接口返回 Excel 文件。
  • generateUserData() 方法:生成示例用户数据。
  • exportToExcel() 方法
    • 使用 EasyExcel 的 write 方法将数据写入 ByteArrayOutputStream
    • sheet("用户数据") 指定工作表名称。
    • doWrite(userList) 写入数据列表。
  • 启动 Spring Boot 应用后,访问 http://localhost:8080/export,即可下载生成的 Excel 文件。

import导入接口说明

  • 导入接口/import 接口接收 Excel 文件并处理。
  • 导入逻辑
    • 使用 EasyExcel 的 read 方法读取上传的 Excel 文件。
    • head(UserData.class) 指定数据模型类。
    • sheet() 指定读取的工作表。
    • doReadSync() 同步读取数据。
  • processUserData() 方法:处理导入的数据,例如保存到数据库。
  • 使用Postman调用接口

3. 总结

t` 接口接收 Excel 文件并处理。

  • 导入逻辑
    • 使用 EasyExcel 的 read 方法读取上传的 Excel 文件。
    • head(UserData.class) 指定数据模型类。
    • sheet() 指定读取的工作表。
    • doReadSync() 同步读取数据。
  • processUserData() 方法:处理导入的数据,例如保存到数据库。
  • 使用Postman调用接口
    在这里插入图片描述

3. 总结

EasyExcel 是一个高性能、易用性强的 Java 库,适用于处理大规模 Excel 文件的导入和导出操作。其基于事件驱动的解析方式、内存友好的特性以及简洁的 API 使得开发者能够高效地完成数据处理任务。然而,在需要处理复杂 Excel 功能(如公式、图表、样式等)时,EasyExcel 的功能可能相对有限。对于大多数常见的 Excel 操作需求,EasyExcel 是一个非常不错的选择,但在特定场景下,可能需要结合使用其他库或工具。

点击下载《Java SpringBoot使用EasyExcel导入导出Excel文件(源代码)》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Deduction(演绎法)和Reduction(还原法)-关于中西方思维的差异

Deduction(演绎法)和Reduction(还原法)-关于中西方思维的差异 最近看到中国新一代战机上天的消息,感慨万千;忽然想起来两年多前一次爬山的时候,一个友人跟我大概说过,Deduction和Reduction分别对应了中国古代和西方古代以来的思考自然和技术发明的思想.于是又在这方面琢磨了一番…

unity学习6:unity的3D项目的基本操作

目录 1 unity界面的基本认识 1.1 file 文件 1.2 edit 编辑/操作 1.3 Assets 1.4 gameobject 游戏对象 1.5 组件 1.6 windows 2 这些部分之间的关系 2.1 关联1&#xff1a; Assets & Project 2.2 关联2&#xff1a;gameobject & component 2.3 关联3&#xff…

【银河麒麟高级服务器操作系统实例】tcp半链接数溢出分析及处理全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://document.kylinos.cn 服务器环境以及配置 系统环境 物理机/虚拟机/云…

k8s基础(2)—Kubernetes-Namespace

一、Namespace概述 名字空间 在 Kubernetes 中&#xff0c;名字空间&#xff08;Namespace&#xff09; 提供一种机制&#xff0c;将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一&#xff0c;但跨名字空间时没有这个要求。 名字空间作用域仅针对带有…

.NET框架用C#实现PDF转HTML

HTML作为一种开放标准的网页标记语言&#xff0c;具有跨平台、易于浏览和搜索引擎友好的特性&#xff0c;使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式&#xff0c;我们可以更方便地在浏览器中展示PDF文档内容&#xff0c;同时也更容…

医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建

FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包&#xff0c;广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发&#xff0c;旨在为神经科学研究人员提供一个高效、精确的数据…

JavaScript 基础2

js的运算符 算数运算符 相加求和&#xff0c;如果用在字符串则是拼接 -相减求差 *相乘求积 /相除求商 %模除求余 具体用法如下 let num 154 let num2 15 document.write(numnum2) document.write(<br>) document.write(num-num2) document.write(<br>) do…

Leecode刷题C语言之我的日程安排表②

执行结果:通过 执行用时和内存消耗如下&#xff1a; typedef struct {int start;int end; }BOOKING;#define MAX_BOOK_NUM (1000) typedef struct MyCalendar_ {BOOKING book[MAX_BOOK_NUM];int bnum;BOOKING *sorted[MAX_BOOK_NUM];int num;int conflict[MAX_BOOK_NUM];int c…

【C语言的小角落】--- 深度理解取余/取模运算

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; C语言的小角落 本篇博客我们来深度理解取余/取模&#xff0c;以及它们在不同语言中出现不同现象的原因。 &#x1f3e0; 关于取整 &#x1f3b5; 向0取整…

网关的主要类型和它们的特点

网关&#xff0c;作为网络通信的关键节点&#xff0c;根据其应用场景和功能特点&#xff0c;可以分为多种类型。 1.协议网关 特点&#xff1a; • 协议转换&#xff1a;协议网关的核心功能是转换不同网络之间的通信协议。例如&#xff0c;它可以将IPv4协议的数据包转换为IPv6协…

聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载

聆听音乐手机版是面向广大音乐爱好者的移动应用程序&#xff0c;用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能&#xff0c;让用户在手机上畅享更舒适的音乐体验&#xff0c;每位用户都能享受精彩纷呈的收听体验。此外&#xff0c;软件还支持无损音质音乐…

实现一个通用的树形结构构建工具

文章目录 1. 前言2. 树结构3. 具体实现逻辑3.1 TreeNode3.2 TreeUtils3.3 例子 4. 小结 1. 前言 树结构的生成在项目中应该都比较常见&#xff0c;比如部门结构树的生成&#xff0c;目录结构树的生成&#xff0c;但是大家有没有想过&#xff0c;如果在一个项目中有多个树结构&…

“善弈者”也需妙手,Oclean欧可林:差异化不是说说而已

作者 | 曾响铃 文 | 响铃说 俗话说&#xff0c;“牙痛不是病&#xff0c;痛起来要人命”。这话意思大家都知道&#xff0c;牙痛虽不是什么大病&#xff0c;可一旦发作却是极难忍受。 前几日&#xff0c;Oclean欧可林举办了一场AirPump A10氧气啵啵冲牙器新品品鉴会&#xff…

汇编语言与接口技术--跑马灯

一、 实验要求 在单片机开发板的LED灯D1~D8上实现跑马灯。LED与单片机引脚连线电路如下图: 单片机芯片选择AT89C51&#xff0c;晶振频率设为12MHz&#xff0c;操作参考单片机开发板使用说明。跑马灯点亮的时间间隔约为1秒。分别用定时器的模式1和模式2实现。&#xff08;用P83…

基于数据融合的智能家居环境监测系统研究与设计(论文+源码)

1总体方案设计 本次基于数据融合的智能家居环境监测系统的设计&#xff0c;其系统总体架构如图2.1所示&#xff0c;整个系统在器件上包括了主控制器STM32F103单片机&#xff0c;MQ可燃气体传感器&#xff0c;光照传感器&#xff0c;DHT11温湿度传感器&#xff0c;风扇&#xff…

Mac中配置Node.js前端vscode环境(第二期)

核心组件&#xff1a;vscode、谷歌浏览器、Node.js&#xff08;重点&#xff09;、git 一、Node.js安装&#xff08;nvm安装&#xff09; 点击macos中的终端&#xff0c;保持bash&#xff0c;而不是zsh 若为zsh&#xff0c;则可在终端中使用下面命令变成bash chsh -s /bin/…

基于SpringBoot和Thymeleaf的仿小米电商系统源码下载与安装指南-幽络源

项目概述 这是一个基于 Spring Boot 2.X 和 Thymeleaf 技术栈的仿小米电商系统。该项目包括了前台商城系统和后台管理系统&#xff0c;经幽络源测试具备完整的电商功能&#xff0c;适合用作学习、参考或作为开发电商系统的基础。 前台商城系统&#xff1a; 包括首页登录、商品…

Deepseek v3 的笔记

基本概述 Deepseek v3是Deepseek发布的旗舰模型&#xff0c;属于607B的混合专家&#xff08;MoE&#xff09;模型&#xff0c;其中活跃参数为37B。在当前的模型领域&#xff0c;它堪称最佳的开源模型&#xff0c;性能超越了Llama 3.1 405b、Qwen和Mistral等知名模型。根据基准…

机器学习中的常用特征选择方法及其应用案例

工业界中&#xff0c;特征选择是机器学习模型开发的重要步骤&#xff0c;可以提高模型性能、减少过拟合和加速计算。针对类别型特征和数值型特征&#xff0c;特征选择方法有所不同。以下详细讲解方法和案例。 一、类别型特征的特征选择 1. 基于卡方检验 卡方检验是一种衡量两…

Pyecharts SVG 标记使用笔记

Pyecharts SVG 标记使用笔记 在数据可视化中&#xff0c;图表的标记点常常用于突出显示重要数据点。Pyecharts 提供了丰富的标记点配置选项&#xff0c;其中使用 SVG 路径来自定义标记点的样式是一个非常强大的功能。本文将详细介绍如何在 Pyecharts 中使用 SVG 路径来定制标记…