专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
51好读  ›  专栏  ›  OSC开源社区

基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

OSC开源社区  · 公众号  · 程序员  · 2017-05-26 08:31

正文

请到「今天看啥」查看全文



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


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


现状

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


导入

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


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


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


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


导出

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


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


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


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


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


导入


方法定义


循环处理模块


使用


分析

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


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


导出


方法定义


循环处理模块


使用


总结

1、入口主要是需要传入 List 数据集合,以及 fieldNames 字段名称


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


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


关于日期类型导出处理


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

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



Demo下载

GJP-Example-ExcelUtil 代码下载:

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




推荐阅读

盘点那些评分最高的项目管理工具,不服来战!

Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比

Spring 思维导图,让 Spring 不再难懂(ioc 篇)

一名 40 岁“老”程序员的反思

“放码过来”邀您亮“项”,一不小心就火了!

点击 “阅读原文” 查看更多精彩内容







请到「今天看啥」查看全文