easyexcel 导出 代码翻译converter_7 行代码实现 Excel 文件导出

6683f04b31474eb6e267ee4971c46721.png

作 者:犬小哈

来 源:首发自「小哈学Java」

广而告之:由于此订阅号换了个皮肤,系统自动取消了读者的公众号置顶。导致用户接受文章不及时。可以打开订阅号,选择置顶(标星)公众号,重磅干货,第一时间送达!

目录

  • 一、前言

  • 二、Apache poi、jxl 的缺陷

  • 三、阿里出品的 EasyExcel,安利一波

  • 四、EasyExcel 解决了什么

  • 五、快速上手

  • 六、特殊场景支持

  • 七、Web 下载示例代码

  • 八、需要注意的点

  • 九、总结

一、前言

关于导出 Excel 文件,可以说是大多数服务中都需要集成的功能。那么,要如何优雅快速地(偷懒地)去实现这个功能呢?

你可能第一想法是:这还不简单?用 Apache 开源框架 poi, 或者 jxl 都可以实现啊。面向百度编程,把代码模板 copy 下来,根据自己的业务再改改,能有多难?

嗯.. 的确不难,但是你的代码可能是下面这个熊样子的:

ac999c72768186e9cdfdbed3970c8979.png

上面这段代码看上去是不是又臭又长呢?今天,小哈将教您如何使用 7 行代码搞定 Excel 文件生成功能!

二、Apache poi、jxl 的缺陷

在说如何实现之前,我们先来讨论一下传统 Excel 框架的不足!除了上面说的,Apache poi、jxl 都存在生成 excel 文件不够简单优雅快速外,它们都还存在一个严重的问题,那就是非常耗内存严重时会导致内存溢出

POI 虽然目前来说,是 excel 解析框架中被使用最广泛的,但这个框架并不完美。

为什么这么说呢?

开发者们大部分使用 POI,都是使用其 userModel 模式。而 userModel 的好处是上手容易使用简单,随便拷贝个代码跑一下,剩下就是写业务转换了,虽然转换也要写上百行代码,但是还是可控的。

然而 userModel 模式最大的问题是在于,对内存消耗非常大,一个几兆的文件解析甚至要用掉上百兆的内存。现实情况是,很多应用现在都在采用这种模式,之所以还正常在跑是因为并发不大,并发上来后,一定会OOM或者频繁的 full gc。

三、阿里出品的 EasyExcel,安利一波

什么是 EasyExcel? 见名知意,就是让你操作 Excel 异常的酸爽。先来看下 EasyExcel GitHub 官方截图:

b7abe1a57f92dd73198dd5b379760a46.png

截止目前为止已有 5519 Star, 官方对其的简介是:

快速、简单避免OOM的java处理Excel工具!

以下是官方介绍:

ddbd6f434dd247a1e9e1722d5734fc2b.png

四、EasyExcel 解决了什么

主要来说,有以下几点:

  • 传统 Excel 框架,如 Apache poi、jxl 都存在内存溢出的问题;

  • 传统 excel 开源框架使用复杂、繁琐;

  • EasyExcel 底层还是使用了 poi, 但是做了很多优化,如修复了并发情况下的一些 bug, 具体修复细节,可阅读官方文档https://github.com/alibaba/easyexcel;

五、快速上手

5.1 添加依赖

com.alibaba

easyexcel

1.1.2-beta5

5.2 七行代码搞定 Excel 生成

b1790db779cd11d709753913c114c818.png

上面这段示例代码中,有两个点很重要,小哈已经重点标注标:

  • ①:WriteModel 这个对象就是要写入 Excel 的数据模型对象,等等,你这好像不行吧?表头 head,以及每个单元格内的数据顺序都没指定,能达到想要的效果么?别急,后面会讨论这块!

  • :创建需要写入的数据集,当然了,正常业务中,这块都是从数据库中查询出来的。

PS: 如果说写入的数据量很大,需要做分片查询再写入的处理,否则可能会 OOM(Out of Memory).

回过头来,我们来看看 WriteModel这个对象内部到底有什么幺蛾子!

a335e4d0836b6589ddb812130ac4d0f7.png

ExayExcel 提供注解的方式, 来方便的定义 Excel 需要的数据模型:

  • :首先,定义的写入模型必须要继承自BaseRowModel.java;

  • :通过@ExcelProperty注解来指定每个字段的列名称,以及下标位置

同时,上面定义的 createModelList方法也很简单,通过循环,创建一个写入模型的 List 集合:

742ad9e2b5a780dc36bcf93fac4a7df0.png

废话不多说,这个快速接入的案例也介绍的差不多了,跑一跑单元测试看下实际效果:

3439fcf44f81646aa9f9b828bb6aa228.png

怎么样,效果还是挺棒棒的!

六、特殊场景支持

在实际的业务中,我们还会有一些特需的需求,比如说下面这些。

6.1 动态生成 Excel 内容

上面的例子是基于注解的,也就是说表头 head, 以及内容都是写死的,换句话说,我定义好了一个数据模型,那么,生成的 Excel 文件也就是只能遵循这种模型来了,但是,实际业务中可能会存在动态变化的需求,要怎么做呢?

f96d7c86f4c7f99d45a288d2e8558f5e.png
  • :无注解模式,动态添加表头,也可自由组合复杂表头,代码如下:

c73f60849589e0bd16b0af70f76b15e0.png
  • :创建动态数据,注意这里的数据类型是Object:

1635949e4e3193b8adf052315750e16e.png

跑一下单元测试,看下效果:

b7bd9cc188f21d5f3d715f8cf32e069a.png

6.2 自定义表头以及内容样式

我想自定义表头,内容样式,咋办?

643d7c03b86d20a672e88586af388276.png

我们复用了上面的示例代码,并额外添加了设置自定义表格样式的代码, createTableStytle具体内容如下:

f36b53a2eab4d51ce08f96943b177fe9.png

我们可以通过 TableStyle这个类来设置表头、表格主题的样式。

6.3 合并单元格

我们可以通过 merge方法来合并单元格:

cc84cc3126068926b7f471c54ef21fe7.png

注意下标是从 0 开始的,也就是说合并了第六行到第七行,其中的第一列到第五列,跑下代码,看下效果:

1051f5f16b8e290b89ffa619b10c440f.png

6.4 自定义处理

对于更复杂的处理,EasyExcel 预留了 WriterHandler接口来,允许你自定义处理代码:

cc8f33e1ffb31b137eacdfadd8030db5.png

接口中定义了三个方法:

  • sheet: 在创建每个 sheet 后自定义业务逻辑处理;

  • row: 在创建每个 row 后自定义业务逻辑处理;

  • cell: 在创建每个 cell 后自定义业务逻辑处理;

我们实现了该接口后,编写自定义逻辑处理代码,然后调用 getWriterWithTempAndHandler静态方法获取ExcelWriter对象时,传入WriterHandler的实现类即可。

eae788eed66aa52ed624e94f61df47ea.png

比如下面的示例代码:

ExcelWriter writer = EasyExcelFactory.getWriterWithTempAndHandler(, out, ExcelTypeEnum.XLSX, true, new MyWriterHandler);

七、Web 下载示例代码

public class Down {

@GetMapping("/a.htm")

public void cooperation(HttpServletRequest request, HttpServletResponse response) {

ServletOutputStream out = response.getOutputStream;

ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);

String fileName = new String(("UserInfo " + new SimpleDateFormat("yyyy-MM-dd").format(new Date))

.getBytes, "UTF-8");

Sheet sheet1 = new Sheet(1, 0);

sheet1.setSheetName("第一个sheet");

writer.write0(getListString, sheet1);

writer.finish;

response.setContentType("multipart/form-data");

response.setCharacterEncoding("utf-8");

response.setHeader("Content-disposition

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值