image.png

本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能。过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好。

由于 poi 本身只是针对于 excel 等office软件的一个工具包,在一些常规的 excel 导入导出时,还需要再做一次精简的封装,简化代码耦合。

现状

本人经历过几家公司的代码封装,导入导出一般存在下面的情况。

导入

1、传入文件地址,返回 Sheet 对象,在业务代码中进行循环遍历,做相对应的类型转换,业务处理(二零零几年的代码框架)

2、传入文件地址,返回 List<String, Object> 的对象,外部直接做强转

3、传入文件地址,返回 List<String, String> 的对象,外部将字符串对象转换为对应的类型

总结:如果只有上述的选择,本人是比较倾向于第二种,毕竟对外层是非常友好的

导出

1、直接在逻辑代码中进行遍历封装sheet,传入到生成file的方法中(二零零几年的代码框架)

2、先循环遍历 List<Model> 对象,转换为 List<Map<String, String>> 对象,带上 fieldName 传入到封装好excel生成的方法中,内部则使用 map.get() 方法操作

3、直接将 List<Model> 对象带上 fieldName 传入到封装好excel生成的方法中,内部将 Model 对象转换为 JSONObject,然后使用 jsonObj.get() 方法操作

4、先将 List<Model> 转换为 JSONArray ,带上 fieldName 传入到封装好excel生成的方法中,内部将 Model 对象转换为 JSONObject,然后使用 jsonObj.get() 方法操作。(使用这种做法,据分析应该是为了执行 jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor("yyyy-MM-dd HH:mm:ss")); 这行代码,可能是为了解决日期类型格式问题)

总结:如果只有上述的选择,本人是比较倾向于第三种,第三种只遍历一次,并且外部未做处理。但是按第四种模式来看,那么第三种模式还是会存在日期格式问题,这个我们后续再分析如何处理。

导入

方法定义

image.png

循环处理模块

image.png图片

使用

image.png

分析

1、入口只需要传入文件名称,以及外部需要读取的key即可

2、内部处理,则针对 数值型、日期类型、字符串 类型已经做了对应处理,外部则直接进行强转对应的类型即可

导出

方法定义

image.png

循环处理模块

image.png

使用

image.png

**总结 ** 1、入口主要是需要传入 List<Model> 数据集合,以及 fieldNames 字段名称

2、内部处理,是直接通过反射获得 get 方法的返回值,进行强转为字符串进行导出

3、为了兼容继承父类的一些共有字段的设计,则加上了一层父类的方法读取

关于日期类型导出处理

日期字段导出指定格式内容

建议在 Model 类中,新增一个扩展字段,并封装一个 get 方法,内容则只是对原字段进行转换,导出时,fieldName 则传递扩展字段即可。如 createTime,示例如下:

image.png

Demo下载

GJP-Example-ExcelUtil 代码下载:

https://pan.baidu.com/s/1jIzFFPO

https://mp.weixin.qq.com/s/BX7FvQaVitpoGRuPzOOq5g