阿里出品的 EasyExcel —— 7 行代码实现 Excel 文件导出

点击进入阿里巴巴EasyExcel 项目GitHub仓库地址 

阿里出品的 EasyExcel,安利一波

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

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

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

以下是官方介绍:

EasyExcel 解决了什么

主要来说,有以下几点:

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

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

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

快速上手

添加依赖

<!--alibaba easyexcel-->

<dependency>

    <groupId>com.alibaba</groupId>

    <artifactId>easyexcel</artifactId>

    <version>1.1.2-beta5</version>

</dependency>

七行代码搞定 Excel 生成

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

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

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

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

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

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

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

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

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

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

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

特殊场景支持

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

 动态生成 Excel 内容

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

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

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

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

自定义表头以及内容样式

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

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

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

合并单元格

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

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

自定义处理

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

接口中定义了三个方法:

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

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

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

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

比如下面的示例代码:

ExcelWriter writer = EasyExcelFactory.getWriterWithTempAndHandler(null, 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", "attachment;filename="+fileName+".xlsx");

        out.flush();

    }

}

需要注意的点

写入大数据时,需分片

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

Excel 最大行数问题

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

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

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

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

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

如何解决呢?

  1. 分多个 Excel 文件写入;

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

总结

EasyExcel 除了写 Excel 文件外,它还有快速读取 Excel 的功能,由于本文主要介绍的是:如何优雅地实现 Excel 文件生成,所以就没有介绍了,有兴趣的小伙伴们,也可以去 GitHub 官网去去查看相关文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值