前言
这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战 。话不多说,要说就是为了补上篇留下的坑 【ExcelUtil】实现文件写出到客户端下载全过程 - 掘金 (juejin.cn)。
需求分析
除了最基础的表头名转换、表头和内容列宽自适应居中外,还需增加对表头顺序位置的指定,指定导出的日期数据时间日期格式,马达马达,对于枚举内容希望能够通过指定的分隔符读取写入值,此外,对于无数据的单元格可以按照需求给默认值 ……
最后,给一个是否导出数据标识用来应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写。
我:
代码实现
自定义注解
首先,根据需求自定义一个注解,其中的每个属性对应一个功能:
1 | java复制代码 |
注解中有一个 Type
内部枚举类,用来区分被注解标识字段是导入还是导出,虽然这里的需求只要做导出,防范于未然,帮助你立身于需求高地。
工具类封装
通过 new ExcelUtil<>(xxx.class);
来创建二次封装对象,ExcelUtil<T>
类中
包含文件名、工作表名等基本属性,还有注解字段列表用来存储通过反射获取被注解标识的 Field
字段对象和对应的注解属性,内部存储结构为:[[Field
, Excel
], …] 。
1 | java复制代码 |
封装类中除了成员变量外,最重要的就是成员方法了,考虑到导出的文件可能有时会需要 .xls
格式,所以我重载了导出 Excel
方法,默认为 .xlsx
格式。
1 | java复制代码 |
导出方法中,首先就是要初始化写入器,然后初始化类属性值:
1 | java复制代码 |
初始化部分成员变量后,创建指定顺序表头,并设置表头别名:
1 | java复制代码 |
先获取目标实体对象的父类和自身所有声明字段,存入临时字段列表,然后循环遍历过滤出被 @Excel
注解标识的字段,然后通过筛选目标导出类型构建一个大小为 2 的数组放入注解字段列表 this.fields
中。
其次,根据注解中 sort
属性值进行升序排序,如果全未设置顺序值,则默认根据字段定义的先后顺序进行排序。排序好之后按顺序设置表头别名,未设置的保持默认字段名。
创建完表头后,接下来就需要根据注解字段列表 fields
中每个字段上的注解属性对象对数据源列表进行处理:
1 | java复制代码 |
上述代码主要通过 Java
反射原理拿到当前对象 object
下 field
字段的属性值,判断当前列数据是否需要导出,需要则进一步判断注解中的属性对应的是否有值,有值且字段属性值不为 null
,就去更改原有值;有值但字段属性值为 null
的,就可以设置为指定的默认值。反之,不需要导出,则将该列所有单元格置空。
单纯理解文字可能没有一个流程图来得直观、清楚,这就给你安排上:
对于解析导出值方法 convertByExp()
,通过分隔符分割翻译注解字符串,根据 “=“ 等于号左边为键、右边为值原则进行解析,具体实现代码如下:
1 | java复制代码 |
以上就完成所有的初始化的工作了,接下来就可以愉快地往 Excel
里写数据,最后写出文件到客户端进行下载。
1 | java复制代码 |
cellWidthSelfAdaption()
方法是用来实现中文宽度自适应的,这里就不贴代码了,详细说明和代码获取请点这里 传送门 (づ ̄3 ̄)づ╭❤~initResponse()
根据导出的Excel
文件名后缀初始化HttpServletResponse
对象来响应体和响应类型。
1 | java复制代码 |
默认导出文件格式为 .xlsx
,不过也可指定为 .xls
,通过设置不同的内容类型实现。至于导出的文件名加个后缀编个码拼接到响应头上即可!
1 | java复制代码 |
至此,整个注解 + ExcelUtil
二次封装的代码就写完了。
暴露接口
实体对象
老样子,实体对象给它套上 @Excel
注解,随便加点属性 “ Buff “:
1 | java复制代码 |
控制层
Service
层 getAllProvinceDetails()
方法具体代码实现请参考 【ExcelUtil】实现文件写出到客户端下载全过程 - 掘金 (juejin.cn) 。
1 | java复制代码 |
导出的文件名后缀放在路径上主要是为了测试的方便,实际开发中 duck 不必这样!
接口测试
开始测试:
GET: http://localhost:8088/file/provinces/custom/excel/export/xls
GET: http://localhost:8088/file/provinces/custom/excel/export/.xlsx
GET: http://localhost:8088/file/provinces/custom/excel/export/""
GET: http://localhost:8088/file/provinces/custom/excel/export/HUALEI
测试全部通过,堪称完美,填坑成功!!撒花 ✿✿ヽ(°▽°)ノ✿
总结
总体实现下来并不算太难,使用注解驱动简直不要太香,用起来很方便,即便没学过编程的小白也会用,一两行代码就能完成一个数据源列表的导出。
唯一不足的就是数据导入没有集成进去,不过本文重点并不在于导入,哈哈哈,有兴趣的小伙伴可以尝试一下哦 ヾ(◍°∇°◍)ノ゙
结尾
撰文不易,欢迎大家点赞、评论,你的关注、点赞是我坚持的不懈动力,感谢大家能够看到这里!Peace & Love。
本文转载自: 掘金