创办网站的步骤,建设微网站项目报告,最新新闻热点事件及评论,装修设计图包括哪些图纸文章目录一、前言二、Apache poi、jxl 的缺陷三、阿里出品的 EasyExcel#xff0c;安利一波四、EasyExcel 解决了什么五、快速上手5.1 添加依赖5.2 七行代码搞定 Excel 生成六、特殊场景支持七、Web 下载示例代码八、需要注意的点九、总结一、前言
关于导出 Excel 文件#…
文章目录一、前言二、Apache poi、jxl 的缺陷三、阿里出品的 EasyExcel安利一波四、EasyExcel 解决了什么五、快速上手5.1 添加依赖5.2 七行代码搞定 Excel 生成六、特殊场景支持七、Web 下载示例代码八、需要注意的点九、总结一、前言
关于导出 Excel 文件可以说是大多数服务中都需要集成的功能。那么要如何优雅快速地偷懒地去实现这个功能呢
你可能第一想法是这还不简单用 Apache 开源框架 poi, 或者 jxl 都可以实现啊。面向百度编程把代码模板 copy 下来根据自己的业务再改改能有多难 嗯… 的确不难但是你的代码可能是下面这个熊样子的 面这段代码看上去是不是又臭又长呢今天小哈将教您如何使用 7 行代码搞定 Excel 文件生成功能
二、Apache poi、jxl 的缺陷
在说如何实现之前我们先来讨论一下传统 Excel 框架的不足除了上面说的Apache poi、jxl 都存在生成 excel 文件不够简单优雅快速外它们都还存在一个严重的问题那就是非常耗内存严重时会导致内存溢出。
POI 虽然目前来说是 excel 解析框架中被使用最广泛的但这个框架并不完美。
为什么这么说呢
开发者们大部分使用 POI都是使用其 userModel 模式。而 userModel 的好处是上手容易使用简单随便拷贝个代码跑一下剩下就是写业务转换了虽然转换也要写上百行代码但是还是可控的。
然而 userModel 模式最大的问题是在于对内存消耗非常大一个几兆的文件解析甚至要用掉上百兆的内存。现实情况是很多应用现在都在采用这种模式之所以还正常在跑是因为并发不大并发上来后一定会OOM或者频繁的 full gc。
三、阿里出品的 EasyExcel安利一波
什么是 EasyExcel? 见名知意就是让你操作 Excel 异常的酸爽。先来看下 EasyExcel GitHub 官方截图 https://github.com/alibaba/easyexcel 速、简单避免OOM的java处理Excel工具
以下是官方介绍
四、EasyExcel 解决了什么
主要来说有以下几点
传统 Excel 框架如 Apache poi、jxl 都存在内存溢出的问题
传统 excel 开源框架使用复杂、繁琐;
EasyExcel 底层还是使用了 poi, 但是做了很多优化如修复了并发情况下的一些 bug, 具体修复细节可阅读官方文档https://github.com/alibaba/easyexcel
五、快速上手
5.1 添加依赖 !-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --
dependencygroupIdcom.alibaba/groupIdartifactIdeasyexcel/artifactIdversion1.1.2-beta5/version
/dependency
5.2 七行代码搞定 Excel 生成 上面这段示例代码中有两个点很重要小哈已经重点标注标
①WriteModel 这个对象就是要写入 Excel 的数据模型对象等等你这好像不行吧表头 head以及每个单元格内的数据顺序都没指定能达到想要的效果么别急后面会讨论这块
②创建需要写入的数据集当然了正常业务中这块都是从数据库中查询出来的。 回过头来我们来看看 WriteModel 这个对象内部到底有什么幺蛾子 ExayExcel 提供注解的方式, 来方便的定义 Excel 需要的数据模型
①首先定义的写入模型必须要继承自 BaseRowModel.java;
②通过 ExcelProperty 注解来指定每个字段的列名称以及下标位置
同时上面定义的 createModelList() 方法也很简单通过循环创建一个写入模型的 List 集合 废话不多说这个快速接入的案例也介绍的差不多了跑一跑单元测试看下实际效果 怎么样效果还是挺棒棒的
六、特殊场景支持
在实际的业务中我们还会有一些特需的需求比如说下面这些。
6.1 动态生成 Excel 内容 上面的例子是基于注解的也就是说表头 head, 以及内容都是写死的换句话说我定义好了一个数据模型那么生成的 Excel 文件也就是只能遵循这种模型来了但是实际业务中可能会存在动态变化的需求要怎么做呢 ①无注解模式动态添加表头也可自由组合复杂表头代码如下
②创建动态数据注意这里的数据类型是 Object: 跑一下单元测试看下效果 6.2 自定义表头以及内容样式 我想自定义表头内容样式咋办 我们复用了上面的示例代码并额外添加了设置自定义表格样式的代码, createTableStytle()具体内容如下 我们可以通过 TableStyle 这个类来设置表头、表格主题的样式。
6.3 合并单元格 我们可以通过 merge() 方法来合并单元格 注意下标是从 0 开始的也就是说合并了第六行到第七行其中的第一列到第五列跑下代码看下效果6.4 自定义处理 对于更复杂的处理EasyExcel 预留了 WriterHandler 接口来允许你自定义处理代码 接口中定义了三个方法:
sheet(): 在创建每个 sheet 后自定义业务逻辑处理
row(): 在创建每个 row 后自定义业务逻辑处理
cell(): 在创建每个 cell 后自定义业务逻辑处理
我们实现了该接口后编写自定义逻辑处理代码然后调用 getWriterWithTempAndHandler()静态方法获取 ExcelWriter 对象时传入 WriterHandler 的实现类即可。
七、Web 下载示例代码
八、需要注意的点
九、总结