首页 微博热点正文

过敏怎么办,惊了!7 行代码高雅地完成 Excel 文件导出功用?,后海


作者:犬小哈

目录

  • 一、前语

  • 二、Apache poi、jxl 的缺点

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

  • 四、EasyExc过敏怎么办,惊了!7 行代码典雅地完结 Excel 文件导出功用?,后海el 处理了什么

  • 五、快速上手

  • 六、特别场景支撑

  • 七、Web 下载示例代码火牛回馈

  • 八、需求留意的点

  • 九、总结

一、前语

关于导出 Excel 文件,能够说是大多数服务中都需求集成的功用。那么,要怎么典雅快速地(偷闲地)去完结这个功用呢?

你或许榜首主意是:这还不简略?用 Apache 开源结构 poi, 或许 jxl 都能够完结啊过敏怎么办,惊了!7 行代码典雅地完结 Excel 文件导出功用?,后海。面向百度编程,把代码模板 co张嫣为什么称艳后py 下来,依据自己的业务再改改,能有多难?

嗯.. 确实不难,可是你的代码或许是下面这个熊姿态的:

上面这段代码看上去是不是又臭又长呢?今日,小哈将教您怎么运用 7 行代码搞定 Excel 文件生成功用!

二、Apache poi、jxl 的缺点

在说怎么完结之前,范粲咱们先来评论一下传统 Excel 结构的缺乏!除了上面说的,Apache poi、jxl 都存在生成 excel 文件不可简略典雅快速外,它们都还存在一金浜路15号个严峻的问题,那便是十分耗内存严峻时会导致内存溢出

POI 尽管现在来说,是 excel 解析结构中被运用最广泛的,但这个结构并不完美。

为什么这么说呢?

开发者们大部分运用 POI,都是运用其 userModel 形式。而 userModel 的优点是上手简略运用简略,随意复制个代码跑一下,剩余便是写业务转化了,尽管转化也要写上百行代码,可是仍是可控的。

可是 userModel 形式最大的问题是在于,对内存耗费十分大,一个几兆的文件解析乃至要用掉上百兆的内存。现实情况是,许多运用现在都在选用这种形式,之所以还正常在跑是因为并发不大,并发上来后,一定会OOM或许频频的 full gc汉唐归来111的博客。

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

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

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

快速、简略避免OOM的java处理Excel东西!

以下是官方介绍:

四、EasyExcel 处理了什么

首要来说,有以下几点:

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

  • 传统 excel 开源结构运用杂乱、繁琐;

  • EasyExcel 底层仍是运用了 poi, 可是做了许多优化,如修正了并发情况下的一些 bug, 详细修正细节,可阅览官方文档https://github.com/alibaba/easyexcel;

五、快速上手

5.1 增加依靠

  1. <!--alibaba easyexcel--&逝梦交易网gt;

  2. <dependency>

  3. <groupId>com.alibaba</groupId>

  4. <artifactId>easyexcel</artifactId>

  5. <version>1.1.2-beta5</version>

  6. </dependency>

5.2 七行代码搞定 Exc米亚冬冬el 生成

上面这段示例代码中,有变声星途两个点很重要,小哈现已要点标注标:

  • ①:WriteModel 这个目标便是要写入 Exce过敏怎么办,惊了!7 行代码典雅地完结 Excel 文件导出功用?,后海l 的数据模型目标,等等,你这如同不可吧?表头 head紧身热裤,以及每个单元格内的数据次序都没指定,能到达想要的作用么?别急,后面会评论这块!

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

PS: 假如说写入的数据量很大,需求做分片查询再写入的处理,不然或许会 OOM(Out of Memory).

回过头来,咱们来看看 WriteModel 这个目标内部到底有什么幺蛾子!

ExayExcel 供给注解的办法, 来便利的界说 Excel 需求的数据模型:

  • :首要,界说的写入模型必需求承继自 BaseRowModel.java;

  • :经过 @ExcelProperty 注解来指定每个字段的列称号,以及下标方位

一起,上面界说的 createModelList() 办法也很简略,经过循环,创立一个写入模型的 List 调集:

废话不多说,这个快速接入的事例也介绍的差不多了,跑一跑单元测试看下实践作用:

怎么样,作用仍是挺棒棒的!

六、特别场景支撑

在实践的业务中,咱们还会有一些特需的需求,比方说下面这些。

6.1 动态生成 Excel 内容

上面的比方是根据注解的,也便是说表头 head, 以及内容都是写死的,换句话说,我界说好了一个数据模型,那么,生成的 过敏怎么办,惊了!7 行代码典雅地完结 Excel 文件导出功用?,后海Excel 文件也便是只能遵从这种模型来了,可是,实践业务中或许会存在动态改变的需求,要怎么做呢?

  • :无注解形式,动态增加表头,也可自由组合杂乱表头,代码如下:

  • :创立动态数据,留意这儿的数据类型是 Object:

跑一下单元测试,看下作用:

6.2 自界说表头以及内容款式

我想自界说表头,内容款式,咋办?

咱们复用了上面的示例代码,并额定增加了设置自界说表格款式的代码, createTableStytle()详细内容如下:

咱们能够经过 TableSt舒奈芙yle 这过敏怎么办,惊了!7 行代码典雅地完结 Excel 文件导出功用?,后海个类来设置表头、表格主题的款式。

6.3 兼并单元格

咱们能够经过 merge() 办法来兼并单元格:

留意下标是从 0 开端的,也便是说兼并了第六行到第七行,其间的榜首列到第五列,跑下代码,看下作用:

6过敏怎么办,惊了!7 行代码典雅地完结 Excel 文件导出功用?,后海.4 自界说处理

关于更杂乱的处理,EasyExcel 预留了 WriterHandler 接口来,答应你自界说处理代码:

接口中界说了三个办法:

  • sheet():过敏怎么办,惊了!7 行代码典雅地完结 Excel 文件导出功用?,后海 在创立每个 sheet 后自界说业务逻辑处理;

  • row(): 在创立每个 row 后自界说业务逻辑处理;

  • cell(): 在创立每个 cell 后自界说业务逻辑处理;

咱们完结了该接口后,编写自界说逻辑处理代码,然后调用 getWriterWithTempAndHandler()静态办法获取 ExcelWriter 目标时,传入 WriterHandler 的完结类即可。

比方下面的示例代码:

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

七、We姚明和穆铁柱合影b 下载示例代码

  1. public class Down不念情义寡欢 {

  2. @GetMappin千物女g("/a.htm")

  3. public void cooperation(HttpServletRequest request, HttpServletResponse 怆天若失response) {

  4. ServletOutputStream out = respo拿铁锁屏nse.getOutputStream();

  5. ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, 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. sheet1.setSheetName("榜首个sheet");

  10. writer.write0(getListString(), sheet1);

  11. writer.finish();

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

  13. response.setCharacterEncoding("utf-8");

  14. response.setHeader("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 源码地址

https://github.com/weiwosuoai/spring-boot-tutorial/tree/master/spring-boot-excel

十一、Ref

https://github.com/alibaba/easyexcel

引荐阅览

搞定SpringBoot2,我引荐你学习这个结构

mybatis-plus支撑分布式业务了?

记住:永久不要在MySQL中运用UTF-8

【收藏】常用JVM指令参数

运用战略形式优化过多 if else 代码

程序员的黑砖窑,东南亚博彩圈套详解

典雅的运用 ThreadLocal

重视一下,尽知JAVA事!

点鸭点鸭

↓↓↓↓

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。