JAVA:探索 EasyExcel 的技术指南

1、简述

在 Java 开发中,Excel 文件的读写操作是一项常见的需求。阿里巴巴开源的 EasyExcel 提供了一种高效、简洁的解决方案,特别是在处理大规模数据时表现尤为突出。本文将详细介绍 EasyExcel 的优缺点、应用场景,并通过实例展示其基本用法。

EasyExcel 官方文档
GitHub - EasyExcel

官网已停止维护

在这里插入图片描述

2、需求

JAVA 解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。
EasyExcel 重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用 EasyExcel 可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

在这里插入图片描述

3、应用

EasyExcel 是一个用于读写 Excel 文件的开源 Java 库。与传统的 Apache POI 相比,EasyExcel 通过减少内存消耗、简化代码结构,使得处理 Excel 文件变得更加轻松,特别是在处理大文件时优势明显。

3.1 Maven 依赖

首先,在项目的 pom.xml 中添加 EasyExcel 的 Maven 依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.2</version>
</dependency>
3.2 写入 Excel 文件

以下代码展示了如何使用 EasyExcel 将数据写入到一个 Excel 文件中:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;import java.util.ArrayList;
import java.util.List;public class EasyExcelWriteExample {public static void main(String[] args) {String fileName = "simpleWrite.xlsx";// 数据准备List<UserData> data = new ArrayList<>();data.add(new UserData(1, "Alice", "alice@example.com"));data.add(new UserData(2, "Bob", "bob@example.com"));// 写入数据到 Excel 文件EasyExcel.write(fileName, UserData.class).sheet("用户信息").doWrite(data);}
}// 定义数据类
class UserData {@ExcelProperty("用户ID")private Integer id;@ExcelProperty("用户名")private String name;@ExcelProperty("邮箱")private String email;public UserData(Integer id, String name, String email) {this.id = id;this.name = name;this.email = email;}// Getters and Setters
}

代码解释:

  • UserData 类通过注解 @ExcelProperty 指定了 Excel 列名和属性的映射关系。
  • 使用 EasyExcel.write() 方法指定写入的文件名和数据类,然后通过 sheet() 方法指定工作表名称,最后调用 doWrite() 将数据写入 Excel 文件。
3.3 读取 Excel 文件

下面的代码展示了如何使用 EasyExcel 从 Excel 文件中读取数据:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;import java.util.ArrayList;
import java.util.List;public class EasyExcelReadExample {public static void main(String[] args) {String fileName = "simpleWrite.xlsx";// 读取数据EasyExcel.read(fileName, UserData.class, new UserDataListener()).sheet().doRead();}
}// 定义数据类(与写入时相同)
class UserData {@ExcelProperty("用户ID")private Integer id;@ExcelProperty("用户名")private String name;@ExcelProperty("邮箱")private String email;// Getters and Setters
}// 定义读取时的监听器
class UserDataListener extends AnalysisEventListener<UserData> {private List<UserData> list = new ArrayList<>();@Overridepublic void invoke(UserData data, AnalysisContext context) {System.out.println("读取到数据: " + data);list.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("所有数据读取完成!");}
}

代码解释:

  • 读取操作使用 EasyExcel.read() 方法,指定要读取的文件名、数据类以及处理读取数据的监听器。
  • AnalysisEventListener 用于处理每一行读取到的数据,通过 invoke() 方法逐行处理数据,doAfterAllAnalysed() 方法在所有数据读取完成后执行。

4、场景

4.1 优点
  • 内存消耗低: EasyExcel 使用流式写入和 SAX 方式解析 Excel 文件,极大减少了内存使用,适合处理大数据量的 Excel 文件。
  • 代码简洁: EasyExcel 提供了简洁的 API,可以在几行代码内完成复杂的 Excel 操作,降低了开发和维护的成本。
  • 支持多种 Excel 格式: 支持 .xls 和 .xlsx 格式的读写操作。
  • 支持复杂的 Excel 模板: 可以处理带有图片、表格、合并单元格等复杂模板的 Excel 文件。
  • 社区活跃: 作为阿里巴巴的开源项目,EasyExcel 有着良好的社区支持和持续更新。
4.2 缺点
  • 功能覆盖面有限: 相比于 Apache POI,EasyExcel 主要聚焦于数据读写,缺乏对 Excel 文件内部结构的全面操作支持。
  • 较少的定制化支持: 在某些高级功能上,EasyExcel 的定制化能力较弱,例如复杂样式的设置。
  • 学习曲线: 对于熟悉 Apache POI 的开发者来说,EasyExcel 的 API 可能需要一定的适应时间。
4.3 应用场景
  • 大规模数据导出: 由于其低内存消耗的特点,EasyExcel 特别适合用于导出包含大量数据的 Excel 文件,如报表生成、数据备份等。
  • 轻量级 Excel 操作: 对于简单的数据导入导出任务,EasyExcel 提供了极简的 API,使得开发者可以快速实现功能。
  • 实时数据导出: 在需要实时生成并导出 Excel 的场景下,EasyExcel 可以在占用最小内存的情况下,高效完成任务。

5、 总结

EasyExcel 作为一种高效的 Excel 读写工具,在处理大规模数据时表现突出。其低内存消耗和简洁的 API 设计,使得开发者能够快速实现 Excel 文件的读写操作。然而,EasyExcel 也存在一些功能上的局限性,尤其是在需要复杂 Excel 操作时。因此,开发者应根据具体需求选择合适的工具。

通过这篇博客,希望你对 EasyExcel 的使用有了更清晰的理解,并能够在实际项目中有效应用。如果你有任何疑问或建议,欢迎在评论区交流讨论。

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

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

相关文章

力扣662:二叉树的最大宽度

给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即&#xff0c;两个端点&#xff09;之间的长度。将这个二叉树视作与满二叉树结构相同&#xff0c;两端…

Elasticsearch基本概念及使用

Elasticsearch 是一个开源的、分布式的全文搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它提供了快速的搜索能力&#xff0c;支持大规模的数据分析&#xff0c;广泛应用于日志分析、全文搜索、监控系统和商业智能等领域。ES操作指令是基于restAPI构建&#xff0c;也就…

Vue.js 项目创建流程

Vue.js 项目创建流程 以下是一个详细的步骤指南&#xff0c;用于在Windows系统上使用NVM&#xff08;Node Version Manager&#xff09;和npm创建一个新的Vue.js项目。 1. 安装Node.js指定版本 首先&#xff0c;使用NVM安装Node.js的20.18.0版本。 nvm install 20输出示例&…

如何判定linux系统CPU的核心架构

背景 在开发一个项目的时候&#xff0c;需要配置安装PyTorch环境&#xff0c;自己电脑以前下载过这个相关的包&#xff0c;但是是X86架构的&#xff0c;不知道复制到Linux系统后能否直接使用&#xff0c;于是想着去确认一下&#xff0c;并把自己的方法总结一下,自己下载的文件…

Vue2:组件

Vue2&#xff1a;组件 非单文件组件定义注册使用 单文件组件 组件是Vue中最核心的内容&#xff0c;在编写页面时&#xff0c;将整个页面视为一个个组件&#xff0c;再把组件拼接起来&#xff0c;这样每个组件之间相互独立&#xff0c;有自己的结构样式&#xff0c;使页面编写思…

408模拟卷较难题(无分类)

模拟卷特别是大题还是很有难度的&#xff0c;而且有些题有错&#xff0c;还是先把真题吃透&#xff0c;后面没时间的话就不整理了。 一棵树转化为二叉树&#xff0c;那么这棵二叉树一定为右子树为空的树 计算不同种形态&#xff0c;即计算6个结点的二叉树有几种形态&#xff0c…

(六)Spark大数据开发实战:豆瓣电影数据处理与分析(scala版)

目录 一、Spark 二、数据介绍 三、Spark大数据开发实战(Scala) 1、数据文件上传HDFS 2、导入模块及数据 3、数据统计与分析 ①、计算演员参演电影数 ②、依次罗列电影番位前十的演员 ③、按照番位计算演员参演电影数 ④、求每位演员所有参演电影中的最早、最晚上映…

SpringMVC学习笔记(二)

五、Rest风格编程 &#xff08;一&#xff09;Rest风格URL规范介绍 1、什么是restful RESTful架构&#xff0c;就是目前最流行的一种互联网软件架构风格。它结构清晰、符合标准、易于理解、扩展方便&#xff0c;所以正得到越来越多网站的采用。REST这个词&#xff0c;是Roy T…

PyTorch深度学习与企业级项目实战-预训练语言模型GPT

【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客 13个PyTorch深度学习案例简介-CSDN博客 《PyTorch深度学习与企业级项目实战&#xff08;人工智能技术丛书&#xff09;》(宋立桓&#xff0c;宋立林)【摘要 书评 试读】- 京东图书 (jd.com) PyTorch深度学习算法与…

CTF攻防世界小白刷题自学笔记13

1.fileinclude,难度&#xff1a;1,方向&#xff1a;Web 题目来源:宜兴网信办 题目描述:无 给一下题目链接&#xff1a;攻防世界Web方向新手模式第16题。 打开一看给了很多提示&#xff0c;什么language在index.php的第九行&#xff0c;flag在flag.php中&#xff0c;但事情显…

【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题

前言 qt、qml项目经常会涉及访问MySQL数据库、网络服务器&#xff0c;并且界面打开时的初始化过程就会涉及到链接Mysql、网络服务器获取数据&#xff0c;如果网络不通&#xff0c;卡个几十秒&#xff0c;会让用户觉得非常的不爽&#xff0c;本文从技术调研的角度讲解解决此类问…

基于OpenCV的自制Python访客识别程序

这是我用Pyqt5&#xff0c;基于OpenCV做的一个Python访客识别程序&#xff0c;它具体包括如下5个功能&#xff1a; 1、选择媒体菜单&#xff0c;可以打开本地摄像头&#xff1b;如果知道rtsp地址&#xff0c;则可以直接访问局域网内的网络串流。 2、选择播放菜单&#xff0c;…

SQL集合运算

集合论是SQL语言的根基。 1 集合运算 注意事项&#xff1a; 1&#xff09;SQL能操作具有重复行的集合&#xff0c;可以通过可选项ALL来支持。 如果直接使用UNION或INTERSECT&#xff0c;结果里不会出现重复的行。如果想在结果里留下重复行&#xff0c;可以加上可选项ALL。写…

Gartner发布安全平台创新洞察:安全平台需具备的11项常见服务

安全和风险管理领导者的任务是管理多个安全供应商和复杂的基础设施堆栈。本研究提供了有关安全平台优势和风险的见解&#xff0c;并提供了为组织选择合适平台的建议。 主要发现 自适应和行为安全防御需要跨安全基础设施组件进行更多的协调&#xff0c;而目前孤立的异构供应商架…

基于海思soc的智能产品开发(两个图像处理来源)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于图像&#xff0c;大家能够想到的一般就是sensor&#xff0c;也就是摄像头。其实对于图像来说&#xff0c;还有另外一个来源&#xff0c;那就是…

如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息

目录 前言一、什么是Web Scraper API二、Web Scraper API 的优势&#xff1a;三、Web Scraper API 适用场景四、实践案例目标需求视频讲解1、选择Web Scraper API2、登录注册3、进入用户控制面板4、选择API5、触发数据收集 API6、获取爬虫结果7、分析爬虫结果&#xff08;1&…

微信小程序中使用离线版阿里云矢量图标

前言 阿里矢量图库提供的在线链接服务仅供平台体验和调试使用&#xff0c;平台不承诺服务的稳定性&#xff0c;企业客户需下载字体包自行发布使用并做好备份。 1.下载图标 将阿里矢量图库的图标先下载下来 解压如下 2.转换格式 贴一个地址用于转换格式&#xff1a;Onlin…

Ubuntu 的 ROS 操作系统安装与测试

引言 机器人操作系统&#xff08;ROS, Robot Operating System&#xff09;是一个用于开发机器人应用的开源框架&#xff0c;它提供了一系列功能丰富的库和工具&#xff0c;能够帮助开发者构建和控制机器人。 当前&#xff0c;ROS1的最新版本为Noetic Ninjemys&#xff0c;专为…

封装一个省市区的筛选组件

筛选功能&#xff1a;只能单选&#xff08;如需多选需要添加show-checkbox多选框属性&#xff09;&#xff0c;选中省传递省的ID&#xff0c;选中市传递省、市的ID&#xff0c; 选中区传递省市区的ID 父组件&#xff1a; <el-form-item><div style"width: 240px;…

python制作一个简单的端口扫描器,用于检测目标主机上指定端口的开放状态

import argparse # 用于解析命令行参数 from socket import * # 导入 socket 库的所有内容&#xff0c;用于网络通信 from threading import * # 导入 threading 库的所有内容&#xff0c;用于多线程操作 # 创建一个信号量&#xff0c;初始值为 1&#xff0c;用于线程同步&…