当前位置:首页 > 新闻中心 > 职场故事 > 正文
一文带你彻底玩转EasyExcel:导入导出excel数据起飞
更新时间:2024-05-01 11:01:45  点击次数:
一文带你彻底玩转EasyExcel:导入导出excel数据起飞

在日常的开发工作中,Excel 文件的读取和写入是非常常见的需求,特别是在后台管理系统中更为频繁,基于传统的方式操作excel通常比较繁琐,EasyExcel 库的出现为我们带来了更简单、更高效的解决方案。本文将介绍 EasyExcel 库的基本用法和一些常见应用场景,帮助开发者更好地利用 EasyExcel 提高工作效率。人网地址:https://github.com/alibaba/easyexcel

青出于蓝而胜于蓝

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模式,在上层做了模型转换的封装,让使用者更加简单方便

16M内存23秒读取75M(46W行25列)的Excel(3.2.1+版本)

当然还有极速模式能更快,不过内存占用会在100M多一点 !

EasyExcel 的核心类主要包括以下几个: ExcelReader: 用于读取 Excel 文件的核心类。通过 ExcelReader 类可以读取 Excel 文件中的数据,并进行相应的处理和操作。ExcelWriter: 用于写入 Excel 文件的核心类。通过 ExcelWriter 类可以将数据写入到 Excel 文件中,并进行样式设置、标题添加等操作。AnalysisEventListener: 事件监听器接口,用于处理 Excel 文件读取过程中的事件,如读取到每一行数据时的操作。AnalysisContext: 读取 Excel 文件时的上下文信息,包括当前行号、sheet 名称等。通过 AnalysisContext 可以获取到读取过程中的一些关键信息。WriteHandler: 写入 Excel 文件时的处理器接口,用于处理 Excel 文件的样式设置、标题添加等操作。WriteSheet: 写入 Excel 文件时的 Sheet 配置类,用于指定写入数据的 Sheet 名称、样式等信息。

这些核心类在 EasyExcel 中承担了不同的角色,协作完成了 Excel 文件的读取和写入操作。开发者可以根据具体的需求和场景,使用这些类来实现 Excel 文件的各种操作。

Alibaba EasyExcel的核心入口类是类,就想我们平时封装的Util类一样,通过它对excel数据读取或者导出。 2.1.简单导入

准备excel数据文件

这里以用户信息数据为例

定义用户信息User类

事件监听器ReadListener

我们一般使用 的 ,用于监听 Excel 文件读取事件的接口,通过实现这个接口,可以在读取 Excel 文件的过程中对数据进行处理和操作:

注意 不能被Spring管理,要每次读取excel都要new一个新的监听器,如果里面用到spring bean,可以通过构造方法传进去

执行测试用例

执行结果控制台输出如下:

完美解析导入,你是否注意到上面我们定义和excel文件的字段一一对应,顺序高度一致,如果顺序映射不一致,比如说定义的时候把姓名name和性别gender的字段顺序调换,会导致导入解析字符串类型转整数失败,这是因为在 EasyExcel 中,当导入数据时,默认情况下是按照 Excel 表格中列的顺序来映射数据的。也就是说,如果 Excel 表格的第一列对应 Java 对象的第一个属性,第二列对应第二个属性,以此类推。

在源码层面,EasyExcel 是通过反射机制来实现数据的映射的。具体来说,EasyExcel 在读取 Excel 文件时,会根据 Java 对象的属性顺序和 Excel 表格中列的顺序来一一对应。这个过程是在 EasyExcel 内部进行的,开发者不需要关心具体的实现细节,只需要提供正确的 Java 对象结构和 Excel 表格格式即可。

项目推荐:基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba企业级系统架构底层框架封装,解决业务开发时常见的非功能性需求,防止重复造轮子,方便业务快速开发和企业技术栈框架统一管理。引入组件化的思想实现高内聚低耦合并且高度可配置化,做到可插拔。严格控制包依赖和统一版本管理,做到最少化依赖。注重代码规范和注释,非常适合个人学习和企业使用

Github地址:https://github.com/plasticene/plasticene-boot-starter-parent

Gitee地址:https://gitee.com/plasticene3/plasticene-boot-starter-parent

微信公众号:Shepherd进阶笔记

交流探讨qun:Shepherd_126 2.2 EasyExcel提供的注解

上面类的定义使用了注解,表示字段不参与数据映射,要不然严格按照顺序就会把excel的地址列映射给导致字符串转整数类型转换错误了。

EasyExcel 提供了一些注解,用于帮助开发者更灵活地控制 Excel 文件的读取和写入操作。以下是 EasyExcel 中常用的注解:

@ExcelProperty

注解用于标注 Java 对象中的属性与 Excel 表格中的列的对应关系。该注解包含以下属性: :指定 Excel 表格中的列索引,表示该属性对应的列在 Excel 表格中的位置。支持字符串形式(如 “A”、“B”、“C”)和数字形式(从 0 开始)。:同 value,用于指定 Excel 表格中的列索引。 和 二选一即可,用于指定 Excel 表格中的列索引。

示例:

一开始我们定义User类时并没有使用,但其实等价于按照类属性顺序从0开始加上了,注意我特意把字段属性姓名name和性别gender调换了顺序,不过index是按照excel来写的,同时我去掉了isDelete的忽略属性。正常解析导入。。。

在我们日常开发过程中,我个人建议在excel映射的类上必须使用注解标注,至于使用还是都可以,但不能同时用,我个人倾向于,这样可以备注字段含义,当然一般人不太会修改excel表头的字段,不过很有可能因为显示查看会拖动excel列的顺序这样就会导致映射出错。

@ExcelIgnore

注解用于标注 Java 对象中的属性,表示在 Excel 文件的读取和写入过程中忽略该属性。示例如上描述

@ExcelIgnoreUnannotated

注解用于指定在读取 Excel 文件时是否忽略未标注 注解的属性,默认为 false,即不忽略。上面我们去掉了isDelete的能正常导出那是因为我们excel文件只有8列刚刚好够标注了映射,加入我们excel文件在添加一列,就会去映射isDelete,不符合我们预期,这时候我们就需要在类使用**@ExcelIgnoreUnannotated**解决此问题

@ExcelSheet

注解用于指定读取 Excel 文件时的 Sheet 名称。通常用于读取多个 Sheet 的情况。

@ExcelIgnoreRowNum

注解用于标注 Java 对象中的属性,表示在 Excel 文件的读取过程中忽略行号。通常用于读取时不需要关注行号的情况。

@ColumnWidth

主要是控制列宽 2.1.3 日期、数字或者自定义格式转换

数据转换我们只需要实现easyexcel封装的接口即可,比如在上面的用户信息类的学号属性userNo统一在excel的值加上前缀, 性别属性gender由字符串转枚举值

UserNoConverter

GenderConverter

在映射的实体类进行转换器绑定:

执行结果:

2.1.4 读取多个sheet

我们前面用户信息基础再加了一个sheet2接着存用户信息,同时新增一个sheet=银行信息存储银行账户信息:

银行账号信息类:

如果我们没有银行信息这个sheet,我们可以用如下代码读写所有sheet:因为每个sheet的数据格式是一样的

每个sheet的数据格式不一样,只能单独一一处理,新建一个处理银行账号信息的监听器:

测试用例方法改为如下:

执行结果:

使用EasyExcel数据导出相对来说很简单,直接上代码,先来看看用户信息类

我们前面说过使用时,不建议同时使用index和value去映射属性,我这里这么写只是让你看看导出效果来突出使用value的好处,话不多说直接看测试用例,我造了10条用户信息数据导出:

导出文件如下所示:

可以看到表头默认为属性名,使用就使用value更符合我们日常需求习惯。

假如导出大批量数据,我们不能一次性查出上百万条数据放入内存一次性导出,很有可能导致OOM,只能分页查询分批导出,实现如下:还是以上面的10天用户信息数据模拟,每3条处理一次导出

动态表头和动态数据

上面的示例都是映射Java类的,其实我可以直接导出excel,表头数据无外乎就是第一行,我们可以灵活设置即可:

更多导出实现比如说设置单元格样式颜色啥的,可查看人方文档:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write

EasyExcel 和 Apache POI 是两个常用的 Java 库,用于处理 Excel 文件。它们有着一些相似之处,同时也有一些不同之处。以下是它们之间的对比:

易用性 EasyExcel:EasyExcel 提供了简单易用的 API,可以方便地进行 Excel 文件的读写操作。它使用了注解来简化开发者的操作,支持直接将 Java 对象写入 Excel 文件,也支持将 Excel 文件转换为 Java 对象。Apache POI:Apache POI 是一个功能强大但相对复杂的库,需要较多的代码来完成 Excel 文件的读写操作。使用 POI 进行 Excel 操作通常需要处理大量的低级 API 调用和数据转换。

性能 EasyExcel:EasyExcel 在性能上表现优异,通过内存映射等技术来优化文件的读写操作,可以处理大型 Excel 文件而不会出现内存溢出等问题。Apache POI:Apache POI 在处理大型 Excel 文件时可能会出现性能问题,特别是在写入大量数据时,可能会占用大量的内存和 CPU 资源。

功能丰富程度 EasyExcel:EasyExcel 提供了丰富的功能,支持多种样式、合并单元格、图片插在入等功能,同时还提供了注解和模板的方式来简化开发者的操作。Apache POI:Apache POI 是一个功能强大的库,提供了丰富的 API 来操作 Excel 文件,支持多种格式的 Excel 文件读写,并且可以进行复杂的操作,如图表、公式、宏等。

社区和文档支持 EasyExcel:EasyExcel 是阿里巴巴开源的项目,拥有活跃的社区和丰富的文档支持。开发者可以在社区中获取到丰富的使用经验和问题解决方案。Apache POI:Apache POI 是 Apache 软件基金会的项目,拥有庞大的社区和完善的文档支持。开发者可以在人方网站上找到详尽的文档和示例代码。

总的来说,EasyExcel 相对于 Apache POI 更易于使用且性能更好,特别适合处理大型 Excel 文件和简单的数据导出导入需求。而 Apache POI 则更加灵活,支持更多复杂的 Excel 操作,适用于对功能要求较高的场景。选择使用哪个库取决于具体的需求和开发者的偏好

EasyExcel 是一个功能强大、易于使用的 Excel 操作工具,它大大简化了 Excel 数据的读取和写入操作,提高了开发效率。通过本文的介绍,相信读者对 EasyExcel 库有了更深入的了解,希望能够在实际开发中更多地利用 EasyExcel 提升工作效率。

温馨提示:尊敬的读者网友,此文章内容来自互联网,其真实性请自行参考,文章并不代表本站的立场,如果此文章内容有侵权或者给您带来影响,请联系本站管理员进行删除,欢迎监督!
本站文章均来自互联网,本站不代表其真实性,若发现本站有侵权文章,请邮件至:8@qq.com 本站将在第一时间删除相关信息,欢迎大家监督。
关于我们 | 广告服务| 版权投诉 | 联系我们 | 吉度活动 | 网站地图
Copyright @ 2021吉度热线 版权所有 All Rights Reserved.