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

点击下载《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);});}
}

2.4 编写测试html文件

在src/main/resources/static目录创建import.html文件,代码如下:

<!DOCTYPE html>
<html>
<head><title>Excel 导入</title>
</head>
<body>
<h1>导入 Excel 文件</h1>
<form method="POST" enctype="multipart/form-data" action="/import"><input type="file" name="file" accept=".xlsx, .xls" /><button type="submit">上传</button>
</form>
</body>
</html>

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调用接口
    在这里插入图片描述
  • 或者直接在浏览器中输入地址:http://127.0.0.1:8080/import.html,然后上传一个excel文件:
    在这里插入图片描述
    结果如下:
    在这里插入图片描述

3. 总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十年后LabVIEW编程知识是否会过时?

在考虑LabVIEW编程知识在未来十年内的有效性时&#xff0c;我们可以从几个角度进行分析&#xff1a; ​ 1. 技术发展与软件更新 随着技术的快速发展&#xff0c;许多编程工具和平台不断更新和改进&#xff0c;LabVIEW也不例外。十年后&#xff0c;可能会有新的编程语言或平台…

【Linux】文件的压缩与解压

目录 gzip和 gunzip bzip2 和 bunzip2(特点和gzip相似) xz和unxz(特点和gzip相似) zip 和 unzip tar gzip和 gunzip 特点&#xff1a;只能对单个的普通文件进行压缩 不能进行归档&#xff0c;压缩或解压后的源文件都不存在 压缩后所生成的压缩格式是.gz格式 压缩&…

touch详讲

&#x1f3dd;️专栏&#xff1a;https://blog.csdn.net/2301_81831423/category_12872319.html &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 基本语法 主要功能 常用选项详解 1. …

【开源免费】基于Vue和SpringBoot的贸易行业crm系统(附论文)

本文项目编号 T 153 &#xff0c;文末自助获取源码 \color{red}{T153&#xff0c;文末自助获取源码} T153&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

仓库叉车高科技安全辅助设备——AI防碰撞系统N2024G-2

在当今这个高效运作、安全第一的物流时代&#xff0c;仓库作为供应链的中心地带&#xff0c;其安全与效率直接关系到企业的命脉。 随着科技的飞速发展&#xff0c;传统叉车作业模式正逐步向智能化、安全化转型&#xff0c;而在这场技术革新中&#xff0c;AI防碰撞系统N2024G-2…

如何打开/处理大型dat文件?二进制格式.dat文件如何打开?Python读取.dat文件

背景&#xff1a; 希望查看C语言输出的二进制DAT文件&#xff0c;写入方式如下&#xff08;如果是视频或游戏&#xff0c;未必能使用这种方式打开&#xff0c;关键是需要知道数据的格式&#xff09; # 写入二进制的C语言fp fopen(str, "wb");for (int i 0; i < …

面向对象分析与设计Python版 活动图与类图

文章目录 一、活动图二、类图 一、活动图 活动图 活动图用于描述业务流程、工作流程或算法中的控制流。活动图强调的是流程中的各个步骤的先后顺序&#xff0c;它可以帮助系统分析师、设计师和程序员更好地理解系统的动态行为。 活动图与用例模型互为补充&#xff0c;主要用于…

51单片机——步进电机模块

直流电机没有正负之分&#xff0c;在两端加上直流电就能工作 P1.0-P1.3都可以控制电机&#xff0c;例如&#xff1a;使用P1.0&#xff0c;则需要把线接在J47的1&#xff08;VCC&#xff09;和2&#xff08;OUT1&#xff09;上 1、直流电机实验 要实现的功能是&#xff1a;直…

2024AAAI SCTNet论文阅读笔记

文章目录 SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation摘要背景创新点方法Conv-Former Block卷积注意力机制前馈网络FFN 语义信息对齐模块主干特征对齐共享解码头对齐 总体架构backbone解码器头 对齐损失 实验SOTA效果对比Cit…

数字IC设计高频面试题

在数字IC设计领域&#xff0c;面试是评估候选人技术能力和问题解决能力的重要环节。数字IC设计的复杂性和要求在不断提高。面试官通常会提出一系列面试题&#xff0c;以考察应聘者在数字设计、验证、时钟管理、功耗优化等方面的专业知识和实践经验。 这些题目不仅涉及理论知识…

Functions

1.trigonometric function 定义和图像 反三角函数是三角函数的反函数 versin(verse -sin)&#xff1a;1/sinx 性质 三角函数的公式 三角恒等式 周期性公式&#xff1a;直接画图记 公式记忆&#xff1a;先想象一个在第一象限的锐角 1&#xff1a;在坐标轴中旋转360 2.sin&am…

1/7 C++

练习&#xff1a;要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩&#xff0c;分别完成空间的申请、成绩的录入、升序排序、成绩输出函数&#xff0c;并在主程序中完成测试 要求使用new #include <iostream>using namespace std; double *addr_new() {double …

[文献精汇]使用PyCaret预测 Apple 股价

介绍 开发一个机器学习模型来尝试通过线性回归分析来预测 Apple 股票的价格会很有趣。PyCaret 的库&#xff0c;这是一个开源的 Python 低代码机器学习库&#xff0c;可以自动化机器学习工作流程&#xff0c;非常适合像我这样的机器学习初学者。 线性回归分析 线性回归分析用…

【51单片机】02LED流水灯实验

点亮你的LED 一、点亮第一个LED1.GPIO介绍2.P1、P2、P3端口 二、LED实验2.尝试点亮LED3.LED流水灯 一、点亮第一个LED 1.GPIO介绍 这块内容这里可以做简单的了解&#xff0c;与数电知识强相关。后续可以再回过头来学习 GPIO (general purpose input output) 通用输入输出端口…

「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用

本篇教程将实现一个打卡提醒小应用&#xff0c;通过用户输入时间进行提醒设置&#xff0c;并展示实时提醒状态&#xff0c;实现提醒设置和取消等功能。 关键词 打卡提醒状态管理定时任务输入校验UI交互 一、功能说明 打卡提醒小应用包含以下功能&#xff1a; 提醒时间输入与…

Python递归(汉诺塔问题)

递归分析 递归&#xff1a;通过自我调用来解决问题的函数 递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。 递归要注意&#xff1a; 1.递归出口 2.当前问题如何变成子问题 利用递归写一个阶乘函数&#xff0c;F(n)&#xff0c;求n的阶乘…

VS2022 C#创建Com组件和调用

生成一个类库项目 这里创建了一个.net 4.8的项目&#xff0c;添加了一个ComAIFaceTest类 如下图&#xff1a; ComAIFaceTest代码如下&#xff1a; [ComVisible(true)][Guid("12345678-ABCD-1234-EF00-0123456789AB")][ClassInterface(ClassInterfaceType.AutoDual)…

【GOOD】A Survey of Deep Graph Learning under Distribution Shifts

深度图学习在分布偏移下的综述&#xff1a;从图的分布外泛化到自适应 Northwestern University, USA Repository Abstract 图上的分布变化——训练和使用图机器学习模型之间的数据分布差异——在现实世界中普遍存在&#xff0c;并且通常不可避免。这些变化可能会严重恶化模…

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代

2024年11月30日&#xff0c;ARM正式发布了其最新的Armv9.5架构&#xff0c;这是Arm技术发展的又一重要里程碑。从表中信息来看&#xff0c;Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升&#xff0c;更是…