@excel 注解_7 行代码实现 Excel 文件导出
作 者:犬小哈
来 源:首发自「小哈学Java」
广而告之:由于此订阅号换了个皮肤,系统自动取消了读者的公众号置顶。导致用户接受文章不及时。可以打开订阅号,选择置顶(标星)公众号,重磅干货,第一时间送达!
目录
一、前言
二、Apache poi、jxl 的缺陷
三、阿里出品的 EasyExcel,安利一波
四、EasyExcel 解决了什么
五、快速上手
六、特殊场景支持
七、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 官方截图:
截止目前为止已有 5519 Star, 官方对其的简介是:
快速、简单避免OOM的java处理Excel工具!
以下是官方介绍:
四、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 生成
上面这段示例代码中,有两个点很重要,小哈已经重点标注标:
①:WriteModel 这个对象就是要写入 Excel 的数据模型对象,等等,你这好像不行吧?表头 head,以及每个单元格内的数据顺序都没指定,能达到想要的效果么?别急,后面会讨论这块!
②:创建需要写入的数据集,当然了,正常业务中,这块都是从数据库中查询出来的。
PS: 如果说写入的数据量很大,需要做分片查询再写入的处理,否则可能会 OOM(Out of Memory).
回过头来,我们来看看 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
的实现类即可。
比如下面的示例代码:
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();
}
}
八、需要注意的点
8.1 写入大数据时,需分片
比如说,我们需要从数据库中查询出数据量较大时,我们需要在业务层做分片处理,也就是,我们需要分多次查询,再写入,防止内存溢出 OOM.
8.2 Excel 最大行数问题
Excel 03, 07 版本均有行数、列数的限制:
版本 | 最大行 | 最大列 |
---|---|---|
Excel 2003 | 65536 | 256 |
Excel 2007 | 1048576 | 16384 |
csv 由于是文本文件,实际上没有最大行数的限制,但是用 Excel 客户端打开还是多了不显示。
也就是说,如果你想写入更多的行数是不行的,强行这么做,程序会报类似如下异常
Invalid row number (1048576) outside allowable range (0..1048575)
如何解决呢?
分多个 Excel 文件写入;
同一个 Excel 文件,分多个 Sheet 写入;
九、总结
小哈今天主要给小伙伴介绍了 EasyExcel, 为什么要使用它,以及演示了相关示例代码。当然了,EasyExcel 除了写 Excel 文件外,它还有快速读取 Excel 的功能,由于本文主要介绍的是:如何优雅地实现 Excel 文件生成,所以就没有介绍了,有兴趣的小伙伴们,也可以去 GitHub 官网去去查看相关文档。
最后,祝您看完本文后有所收获,下期见!
十、GitHub 源码地址
https://github.com/weiwosuoai/spring-boot-tutorial/tree/master/spring-boot-excel
十一、参考文献
https://github.com/alibaba/easyexcel
推荐阅读
1. 前端高级工程师,需要掌握哪些技术?
2. IEEE下令清理华为系审稿人!
3. 分库分表就能无限扩容吗?
4. 我在 GitHub 上见过哪些奇葩的 Chrome 插件?
@excel 注解_7 行代码实现 Excel 文件导出相关推荐
- asp.net导出excel-一行代码实现excel、xml、pdf、word、html、csv等7种格式文件导出功能而且美观-SNF快速开发平台...
分享: 腾讯微博 新浪微博 搜狐微博 网易微博 腾讯朋友 百度贴吧 豆瓣 QQ好友 人人网 作者:王春天 原文地址:http://www.cnblogs.com/spring_ ...
- vb.net读取excel并写入dgv_读取PDF中的表格写入EXCEL?30行代码搞定
办公自动化系列+1 现在,各类数据分析的书籍,都可以在网上找到PDF版本: 同时,百度文库.各类数据统计文库.行业研究等众多论文报告,是通过PDF的形式去展示输出的: 但是,令人都头疼的是,各类数据分 ...
- python80行代码写一个文件整理软件
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 源代码: #–coding:utf-8– from PySide2.QtWidgets import QApplication, QMain ...
- python用excel数据做热力图_7行代码 Python热力图可视化分析缺失数据处理-Python 实用宝典...
Python热力图寻找缺失数据 你有没有遇到一种情况,处理一张很大的csv表格的时候很难找到表格中每一列的缺失数据,或者说处理速度非常慢 ?当然如果你的Excel水平非常高,这个可能不会成为你的问题, ...
- node-xlsx - 简单几行代码处理导入、导出 excel 表格数据,免费开源的 javascript 工具库
最近开发的项目上需要把数据导出为 xlsx 文档,找了一圈,发现 node-xlsx 简单好用,分享给各位. 关于 node-xlsx 在 web 开发中,管理后台生成 excel 报表并且下载,一个 ...
- 使用xlsx.js 40行代码实现excel预览
借助xlsx.js将excel转成table,自己再加点样式就可以了 转成table的效果 原Excel <!DOCTYPE html> <html lang="en&qu ...
- python 第三方包自动导入_7行代码,彻底告别python第三方包import导入问题!
最近有不少小伙伴咨询关于pyton第三方包导入的问题,今天我们就来聊聊第三方包导入那些事. 随着对python学习的渐入臻境,越来越多的小伙伴们开始导入自己所需的第三方包,实现各种各样的功能.但是,他 ...
- python处理excel字典-使用Python代码处理Excel
使用Python操作Excel不是什么难事,需要用到两个Lib, python-xlrd,python-xlwt 安装 pip install xlrd xlwt 支持xls,xlsx格式 写Exce ...
- 怒打1300行代码,一个文件实现停车场管理系统,C++语言代码挑战
停车场具有实时功能.话不多说直接上代码,虽然有1300行左右,但是放在DevC++上直接就能跑.C++如果你已经学到位,即使1300行你也可以理解上去. #include<stdlib.h> ...
最新文章
- 146. LRU Cache--java,python解法
- 家长学校.net keti.html,家长学校教科研的工作制度
- div模拟textarea文本域轻松实现高度自适应
- Oracle数据库备份报错12514,Oracle数据库备份导出时,出错:ORA-12514
- java jar包示例_Java包getImplementationVersion()方法和示例
- docker搭建sonar服务
- 基于深度学习模型的麻蕉疾病自动识别(增加形态计量和几何分析)
- Jquery中$与$.fn的区别
- linux7关闭开机自启,redhat7 设置开机自启
- android o 可下载字体,android自定义字体
- 系统分析师-论文准备
- java ssh ssm_JAVA --- SSH和SSM的区别
- xp计算机连接不上网络打印机驱动,windows xp系统打印机共享提示连接失败的解决方法...
- 华为服务器装系统识别不到硬盘,重装Windows10系统找不到硬盘的两种解决方法
- 2021年中国遗嘱人群画像情况(附子女情况、婚姻状况、学历、年龄、性别及各学历段人数分布)[图]
- 计算机技巧数学,如何快速掌握数学技巧
- lisp6 暖通cad_浩辰CAD暖通2018
- 段式存储、页式存储及段页式存 详解
- 小明医声发布,看AI技术秀得飞起
- 软件开发方法论:TDD、BDD、DDD、ATDD、DevOps
热门文章
- is属性用法 vue_Vue中is属性的用法 可以动态切换组件
- PyTorch模型的保存加载以及数据的可视化
- neo4j删除所有节点
- Leetcode 47. 全排列 II (每日一题 20211015)
- 202. Happy Number
- python 笔记:argparse
- 错误解决 :Microsoft Visual C++ 14.0 is require Microsoft Visual C++ Builder 包丢失或者损坏
- python库整理目录
- php 多用户 判断,Laravel jwt 多表(多用户端)验证隔离的实现
- 深度学习100例-卷积神经网络(VGG-19)识别灵笼中的人物 | 第7天