🏆【Alibaba 工具型技术系列】「EasyExcel 技术专题」实战技术针对于项目中常用的 Excel 操作指南
EasyExcel 教程
本文使用的技术是 Alibaba 集团开源的 EasyExcel 技术,该技术是针对 Apache POI 技术的封装和优化,主要解决了 POI 技术的耗内存问题,并且提供了较好的 API 使用。
使用步骤繁琐
动态写出 Excel 操作非常麻烦
对于新手来说,很难在短时间内上手
读写时需要占用较大的内容,当数据量大时容器发生 OOM
Maven 依赖
EasyExcel API 分析介绍
Ø EasyExcel 入口类,用于构建开始各种操作
Ø ExcelReaderBuilder ExcelWriterBuilder 构建出一个 ReadWorkbook WriteWorkbook,可以理解成一个 excel 对象,一个 excel 只要构建一个
Ø ExcelReaderSheetBuilder ExcelWriterSheetBuilder 构建出一个 ReadSheet WriteSheet 对象,可以理解成 excel 里面的一页,每一页都要构建一个
Ø ReadListener 在每一行读取完毕后都会调用 ReadListener 来处理数据
Ø WriteHandler 在每一个操作包括创建单元格、创建表格等都会调用 WriteHandler 来处理数据
Ø 所有配置都是继承的,Workbook 的配置会被 Sheet 继承,所以在用 EasyExcel 设置参数的时候,在 EasyExcel…sheet()方法之前作用域是整个 sheet,之后针对单个 sheet
EasyExcel 注解
Ø ExcelProperty 指定当前字段对应 excel 中的那一列。可以根据名字或者 Index 去匹配。当然也可以不写,默认第一个字段就是 index=0,以此类推。千万注意,要么全部不写,要么全部用 index,要么全部用名字去匹配。千万别三个混着用,除非你非常了解源代码中三个混着用怎么去排序的。
Ø ExcelIgnore 默认所有字段都会和 excel 去匹配,加了这个注解会忽略该字段
Ø DateTimeFormat 日期转换,用 String 去接收 excel 日期格式的数据会调用这个注解。里面的 value 参照 java.text.SimpleDateFormat
Ø NumberFormat 数字转换,用 String 去接收 excel 数字格式的数据会调用这个注解。里面的 value 参照 java.text.DecimalFormat
Ø ExcelIgnoreUnannotated 默认不加 ExcelProperty 的注解的都会参与读写,加了不会参与
通用参数
Ø ReadWorkbook,ReadSheet 都会有的参数,如果为空,默认使用上级。
Ø converter 转换器,默认加载了很多转换器。也可以自定义。
Ø readListener 监听器,在读取数据的过程中会不断的调用监听器。
Ø headRowNumber 需要读的表格有几行头数据。默认有一行头,也就是认为第二行开始起为数据。
Ø head 与 clazz 二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用 class。
Ø clazz 与 head 二选一。读取文件的头对应的 class,也可以使用注解。如果两个都不指定,则会读取全部数据。
Ø autoTrim 字符串、表头等数据自动 trim
Ø password 读的时候是否需要使用密码
ReadWorkbook(理解成 excel 对象)参数
Ø excelType 当前 excel 的类型 默认会自动判断
Ø inputStream 与 file 二选一。读取文件的流,如果接收到的是流就只用,不用流建议使用 file 参数。因为使用了 inputStream easyexcel 会帮忙创建临时文件,最终还是 file
Ø file 与 inputStream 二选一。读取文件的文件。
Ø autoCloseStream 自动关闭流。
Ø readCache 默认小于 5M 用 内存,超过 5M 会使用 EhCache,这里不建议使用这个参数。
ReadSheet(就是 excel 的一个 Sheet)参数
Ø sheetNo 需要读取 Sheet 的编码,建议使用这个来指定读取哪个 Sheet
Ø sheetName 根据名字去匹配 Sheet,excel 2003 不支持根据名字去匹配
注解
Ø ExcelProperty index 指定写到第几列,默认根据成员变量排序。value 指定写入的名称,默认成员变量的名字,多个 value 可以参照快速开始中的复杂头
Ø ExcelIgnore 默认所有字段都会写入 excel,这个注解会忽略这个字段
Ø DateTimeFormat 日期转换,将 Date 写到 excel 会调用这个注解。里面的 value 参照 java.text.SimpleDateFormat
Ø NumberFormat 数字转换,用 Number 写 excel 会调用这个注解。里面的 value 参照 java.text.DecimalFormat
Ø ExcelIgnoreUnannotated 默认不加 ExcelProperty 的注解的都会参与读写,加了不会参与
参数
通用参数
Ø WriteWorkbook,WriteSheet ,WriteTable 都会有的参数,如果为空,默认使用上级。
Ø converter 转换器,默认加载了很多转换器。也可以自定义。
Ø writeHandler 写的处理器。可以实现 WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入 excel 的不同阶段会调用
Ø relativeHeadRowIndex 距离多少行后开始。也就是开头空几行
Ø needHead 是否导出头
Ø head 与 clazz 二选一。写入文件的头列表,建议使用 class。
Ø clazz 与 head 二选一。写入文件的头对应的 class,也可以使用注解。
Ø autoTrim 字符串、表头等数据自动 trim
WriteWorkbook(理解成 excel 对象)参数
Ø excelType 当前 excel 的类型 默认 xlsx
Ø outputStream 与 file 二选一。写入文件的流
Ø file 与 outputStream 二选一。写入的文件
Ø templateInputStream 模板的文件流
Ø templateFile 模板文件
Ø autoCloseStream 自动关闭流。
Ø password 写的时候是否需要使用密码
Ø useDefaultStyle 写的时候是否是使用默认头
WriteSheet(就是 excel 的一个 Sheet)参数
Ø sheetNo 需要写入的编码。默认 0
Ø sheetName 需要些的 Sheet 名称,默认同 sheetNo
WriteTable(就把 excel 的一个 Sheet,一块区域看一个 table)参数
Ø tableNo 需要写入的编码。默认 0
EasyExcel 用法指南
简单的读取 excel 文件
简单的写入 excel 文件
Web 上传与下载
详解读取 Excel
对象模型
监听器
代码
读取多个 sheet
自定义格式转换
多行头
读取表头数据
覆盖监听器 invokeHeadMap 方法
异常处理
覆盖监听器 onException 方法
导出指定的列
调整指定列顺序
复杂头写入
前面属于主标题,后面属于副标题
图片导出
列宽、行高
@HeadRowHeight(value = 35) // 表头行高
@ContentRowHeight(value = 25) // 内容行高
@ColumnWidth(value = 50) // 列宽
此外还有,自适应宽度,但是这个不是特别精确
动态表头
合并单元格
每隔 2 行会合并 把 eachColumn 设置成 3 也就是我们数据的长度,所以就第一列会合并。当然其他合并策略也可以自己写
这里 需要指定写用哪个 class 去写,然后写到第一个 sheet,名字为模板 然后文件流会自动关闭
web 数据写出
模板格式导出
如果需要横向填充只需要模板设置好就可以。
简单的 Excel 模板
实现模板填充
模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"{","}"代替
复杂的填充
使用 List 集合的方法批量写入数据,点表示该参数是集合
模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"{","}"代替
// 这里注意 入参用了 forceNewRow 代表在写入 list 的时候不管 list 下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是 false,会直接使用下一行,如果没有则创建。
总结一个工具类
参考资料
https://github.com/alibaba/easyexcel/blob/master/docs/API.md 官方 api
https://github.com/alibaba/easyexcel easyexcel github 地址
https://blog.csdn.net/sinat_32366329/article/details/103109058 easyexcel 总结
https://alibaba-easyexcel.github.io/index.html 官方示例
版权声明: 本文为 InfoQ 作者【李浩宇/Alex】的原创文章。
原文链接:【http://xie.infoq.cn/article/a3ae955b7a44a85d1f94130c8】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论