作家:狗小夏

资料来源:从“小哈学习Java”开始

广告:由于这个订单号改变了皮肤,系统自动取消了读者公众号正常。不让用户及时接受文章。打开订单号码,选择top(星号)公众号,选择重型干货,第一次送货!

目录

一个,前言

二、Apache POI、jxl缺陷

三、阿里出品的EasyExcel、安利一派

第四,EasyExcel解决了什么

五、快速启动

六、支持特殊场景

七、网络下载样本代码

八、需要注意的地方

九、摘要

关于

一、前言

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

第一个想法是:“还不简单吗?”是。可以使用Apache开源帧poi或jxl实现。为了百度编程,下载代码模板copy,根据自己的工作重新修改,有多难?

嗯.不难,但你的代码可能是以下熊形状。

上面的代码看起来又臭又长吗?今天,小夏将教您如何使用7行代码获得Excel文件生成功能!

在谈如何实施

二、Apache poi、jxl 的缺陷

之前,让我们先来看一下现有Excel框架的缺点!除了上面提到的以外,Apache poi、jxl都有一个严重的问题,即生成excel文件不仅简单、不优雅,还会占用大量内存,严重的情况下会发生内存溢出。

POI目前在excel解析框架中使用最广泛,但该框架并不完善。

为什么这么说?

开发者大多使用POI,都使用userModel模式。UserModel的优点是使用方便,随意复制代码,剩下的写业务转换。转换也需要写数百行代码,但仍然可以控制。(阿尔伯特爱因斯坦,《北方司法》前情提要)。

但是userModel模式最大的问题是内存消耗非常大,所以分析几兆字节的文件也要使用100兆字节的内存。现实是,很多应用程序现在都采用这种模式。还正常跑的原因是并发性不大,并发性上来就一定有OOM或者频繁的全GC。

什么是

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

EasyExcel?从名义上看,可以看出操作Excel以上的酸。请看EasyExcel GitHub的官方截图。

至今拥有5519明星,官方介绍如下。

快速简单的防止OOM的Java处理Excel工具!

下面是官方介绍。

四、EasyExcel 解决了什么

周,有以下几点。

现有的Excel框架(如Apache POI和jxl)存在内存溢出问题。

传统的excel开源框架复杂繁琐。

EasyExcel的底层仍然使用poi,但是进行了很多优化,包括恢复并发的一些bug,细节可以阅读官方文档。

五、快速上手

5.1 添加依赖

!- alibaba easyexcel -

Dependency

Groupidcom.alibaba/g

roupId>

  • <artifactId>easyexcel</artifactId>

  • <version>1.1.2-beta5</version>

  • </dependency>

  • 5.2 七行代码搞定 Excel 生成

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

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

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

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

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

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

    • ①:首先,定义的写入模型必须要继承自Ba;

    • ②:通过@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的实现类即可。

    比如下面的示例代码:

    1. ExcelWriter writer = Ea(, out, ExcelTy, true, new MyWriterHandler);

    七、Web 下载示例代码

    1. public class Down {

    2. @GetMapping(";)

    3. public void cooperation(HttpServletRequest request, HttpServletResponse response) {

    4. ServletOutputStream out = re;

    5. ExcelWriter writer = new ExcelWriter(out, ExcelTy, true);

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

    7. .getBytes, "UTF-8");

    8. Sheet sheet1 = new Sheet(1, 0);

    9. ("第一个sheet");

    10. wri(getListString, sheet1);

    11. wri;

    12. re("multipart/form-data");

    13. re("utf-8");

    14. re("Content-disposition", "attachment;filename="+fileName+".xlsx");

    15. out.flush;

    16. }

    17. }

    八、需要注意的点

    8.1 写入大数据时,需分片

    比如说,我们需要从数据库中查询出数据量较大时,我们需要在业务层做分片处理,也就是,我们需要分多次查询,再写入,防止内存溢出 OOM.

    8.2 Excel 最大行数问题

    Excel 03, 07 版本均有行数、列数的限制:

    版本最大行最大列
    Excel 200365536256
    Excel 2007104857616384

    csv 由于是文本文件,实际上没有最大行数的限制,但是用 Excel 客户端打开还是多了不显示。

    也就是说,如果你想写入更多的行数是不行的,强行这么做,程序会报类似如下异常

    1. Invalid row number (1048576) outside allowable range (0..1048575)

    如何解决呢?

    1. 分多个 Excel 文件写入;

    2. 同一个 Excel 文件,分多个 Sheet 写入;

    九、总结

    小哈今天主要给小伙伴介绍了 EasyExcel, 为什么要使用它,以及演示了相关示例代码。当然了,EasyExcel 除了写 Excel 文件外,它还有快速读取 Excel 的功能,由于本文主要介绍的是:如何优雅地实现 Excel 文件生成,所以就没有介绍了,有兴趣的小伙伴们,也可以去 GitHub 官网去去查看相关文档。

    最后,祝您看完本文后有所收获,下期见!

    十、GitHub 源码地址

    十一、参考文献

    1.《【weka怎么导出excel】7行代码实现导出Excel文件》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

    2.《【weka怎么导出excel】7行代码实现导出Excel文件》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

    3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/2506964.html