失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 推荐一款非常好用的Excel导入导出工具EasyPoi

推荐一款非常好用的Excel导入导出工具EasyPoi

时间:2020-11-10 14:58:15

相关推荐

推荐一款非常好用的Excel导入导出工具EasyPoi

EasyPoi简介

用惯了SpringBoot的朋友估计会想到,有没有什么办法可以直接定义好需要导出的数据对象,然后添加几个注解,直接自动实现Excel导入导出功能?

EasyPoi正是这么一款工具,如果你不太熟悉POI,想简单地实现Excel操作,用它就对了!

EasyPoi的目标不是替代POI,而是让一个不懂导入导出的人也能快速使用POI完成Excel的各种操作,而不是看很多API才可以完成这样的工作。

集成

在SpringBoot中集成EasyPoi非常简单,只需添加如下一个依赖即可,真正的开箱即用!

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency>

使用

接下来介绍下EasyPoi的使用,以会员信息和订单信息的导入导出为例,分别实现下简单的单表导出和具有关联信息的复杂导出。

简单导出

我们以会员信息列表导出为例,使用EasyPoi来实现下导出功能,看看是不是够简单!

首先创建一个会员对象Member,封装会员信息;

/***购物会员*Createdbymacroon/10/12.*/@Data@EqualsAndHashCode(callSuper=false)publicclassMember{@Excel(name="ID",width=10)privateLongid;@Excel(name="用户名",width=20,needMerge=true)privateStringusername;privateStringpassword;@Excel(name="昵称",width=20,needMerge=true)privateStringnickname;@Excel(name="出生日期",width=20,format="yyyy-MM-dd")privateDatebirthday;@Excel(name="手机号",width=20,needMerge=true,desensitizationRule="3_4")privateStringphone;privateStringicon;@Excel(name="性别",width=10,replace={"男_0","女_1"})privateIntegergender;}

在此我们就可以看到EasyPoi的核心注解@Excel,通过在对象上添加@Excel注解,可以将对象信息直接导出到Excel中去,下面对注解中的属性做个介绍;

name:Excel中的列名;

width:指定列的宽度;

needMerge:是否需要纵向合并单元格;

format:当属性为时间类型时,设置时间的导出导出格式;

desensitizationRule:数据脱敏处理,3_4表示只显示字符串的前3位和后4位,其他为*号;

replace:对属性进行替换;

suffix:对数据添加后缀。

接下来我们在Controller中添加一个接口,用于导出会员列表到Excel,具体代码如下;

/***EasyPoi导入导出测试Controller*Createdbymacroon/10/12.*/@Controller@Api(tags="EasyPoiController",description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation(value="导出会员列表Excel")@RequestMapping(value="/exportMemberList",method=RequestMethod.GET)publicvoidexportMemberList(ModelMapmap,HttpServletRequestrequest,HttpServletResponseresponse){List<Member>memberList=LocalJsonUtil.getListFromJson("json/members.json",Member.class);ExportParamsparams=newExportParams("会员列表","会员列表",ExcelType.XSSF);map.put(NormalExcelConstants.DATA_LIST,memberList);map.put(NormalExcelConstants.CLASS,Member.class);map.put(NormalExcelConstants.PARAMS,params);map.put(NormalExcelConstants.FILE_NAME,"memberList");PoiBaseView.render(map,request,response,NormalExcelConstants.EASYPOI_EXCEL_VIEW);}}

LocalJsonUtil工具类,可以直接从resources目录下获取JSON数据并转化为对象,例如此处使用的members.json

运行项目,直接通过Swagger访问接口,注意在Swagger中访问接口无法直接下载,需要点击返回结果中的下载按钮才行,访问地址:http://localhost:8088/swagger-ui/

下载完成后,查看下文件,一个标准的Excel文件已经被导出了。

简单导入

导入功能实现起来也非常简单,下面以会员信息列表的导入为例。

在Controller中添加会员信息导入的接口,这里需要注意的是使用@RequestPart注解修饰文件上传参数,否则在Swagger中就没法显示上传按钮了;

/***EasyPoi导入导出测试Controller*Createdbymacroon/10/12.*/@Controller@Api(tags="EasyPoiController",description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation("从Excel导入会员列表")@RequestMapping(value="/importMemberList",method=RequestMethod.POST)@ResponseBodypublicCommonResultimportMemberList(@RequestPart("file")MultipartFilefile){ImportParamsparams=newImportParams();params.setTitleRows(1);params.setHeadRows(1);try{List<Member>list=ExcelImportUtil.importExcel(file.getInputStream(),Member.class,params);returnCommonResult.success(list);}catch(Exceptione){e.printStackTrace();returnCommonResult.failed("导入失败!");}}}

然后在Swagger中测试接口,选择之前导出的Excel文件即可,导入成功后会返回解析到的数据。

复杂导出

当然EasyPoi也可以实现更加复杂的Excel操作,比如导出一个嵌套了会员信息和商品信息的订单列表,下面我们来实现下!

首先添加商品对象Product,用于封装商品信息;

/***商品*Createdbymacroon/10/12.*/@Data@EqualsAndHashCode(callSuper=false)publicclassProduct{@Excel(name="ID",width=10)privateLongid;@Excel(name="商品SN",width=20)privateStringproductSn;@Excel(name="商品名称",width=20)privateStringname;@Excel(name="商品副标题",width=30)privateStringsubTitle;@Excel(name="品牌名称",width=20)privateStringbrandName;@Excel(name="商品价格",width=10)privateBigDecimalprice;@Excel(name="购买数量",width=10,suffix="件")privateIntegercount;}

然后添加订单对象Order,订单和会员是一对一关系,使用@ExcelEntity注解表示,订单和商品是一对多关系,使用@ExcelCollection注解表示,Order就是我们需要导出的嵌套订单数据;

/***订单*Createdbymacroon/10/12.*/@Data@EqualsAndHashCode(callSuper=false)publicclassOrder{@Excel(name="ID",width=10,needMerge=true)privateLongid;@Excel(name="订单号",width=20,needMerge=true)privateStringorderSn;@Excel(name="创建时间",width=20,format="yyyy-MM-ddHH:mm:ss",needMerge=true)privateDatecreateTime;@Excel(name="收货地址",width=20,needMerge=true)privateStringreceiverAddress;@ExcelEntity(name="会员信息")privateMembermember;@ExcelCollection(name="商品列表")privateList<Product>productList;}

接下来在Controller中添加导出订单列表的接口,由于有些会员信息我们不需要导出,可以调用ExportParams中的setExclusions方法排除掉;

/***EasyPoi导入导出测试Controller*Createdbymacroon/10/12.*/@Controller@Api(tags="EasyPoiController",description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation(value="导出订单列表Excel")@RequestMapping(value="/exportOrderList",method=RequestMethod.GET)publicvoidexportOrderList(ModelMapmap,HttpServletRequestrequest,HttpServletResponseresponse){List<Order>orderList=getOrderList();ExportParamsparams=newExportParams("订单列表","订单列表",ExcelType.XSSF);//导出时排除一些字段params.setExclusions(newString[]{"ID","出生日期","性别"});map.put(NormalExcelConstants.DATA_LIST,orderList);map.put(NormalExcelConstants.CLASS,Order.class);map.put(NormalExcelConstants.PARAMS,params);map.put(NormalExcelConstants.FILE_NAME,"orderList");PoiBaseView.render(map,request,response,NormalExcelConstants.EASYPOI_EXCEL_VIEW);}}

在Swagger中访问接口测试,导出订单列表对应Excel;

下载完成后,查看下文件,EasyPoi导出复杂的Excel也是很简单的!

自定义处理

如果你想对导出字段进行一些自定义处理,EasyPoi也是支持的,比如在会员信息中,如果用户没有设置昵称,我们添加下暂未设置信息。

我们需要添加一个处理器继承默认的ExcelDataHandlerDefaultImpl类,然后在exportHandler方法中实现自定义处理逻辑;

/***自定义字段处理*Createdbymacroon/10/13.*/publicclassMemberExcelDataHandlerextendsExcelDataHandlerDefaultImpl<Member>{@OverridepublicObjectexportHandler(Memberobj,Stringname,Objectvalue){if("昵称".equals(name)){StringemptyValue="暂未设置";if(value==null){returnsuper.exportHandler(obj,name,emptyValue);}if(valueinstanceofString&&StrUtil.isBlank((String)value)){returnsuper.exportHandler(obj,name,emptyValue);}}returnsuper.exportHandler(obj,name,value);}@OverridepublicObjectimportHandler(Memberobj,Stringname,Objectvalue){returnsuper.importHandler(obj,name,value);}}

然后修改Controller中的接口,调用MemberExcelDataHandler处理器的setNeedHandlerFields设置需要自定义处理的字段,并调用ExportParamssetDataHandler设置自定义处理器;

/***EasyPoi导入导出测试Controller*Createdbymacroon/10/12.*/@Controller@Api(tags="EasyPoiController",description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation(value="导出会员列表Excel")@RequestMapping(value="/exportMemberList",method=RequestMethod.GET)publicvoidexportMemberList(ModelMapmap,HttpServletRequestrequest,HttpServletResponseresponse){List<Member>memberList=LocalJsonUtil.getListFromJson("json/members.json",Member.class);ExportParamsparams=newExportParams("会员列表","会员列表",ExcelType.XSSF);//对导出结果进行自定义处理MemberExcelDataHandlerhandler=newMemberExcelDataHandler();handler.setNeedHandlerFields(newString[]{"昵称"});params.setDataHandler(handler);map.put(NormalExcelConstants.DATA_LIST,memberList);map.put(NormalExcelConstants.CLASS,Member.class);map.put(NormalExcelConstants.PARAMS,params);map.put(NormalExcelConstants.FILE_NAME,"memberList");PoiBaseView.render(map,request,response,NormalExcelConstants.EASYPOI_EXCEL_VIEW);}}

再次调用导出接口,我们可以发现昵称已经添加默认设置了。

总结

体验了一波EasyPoi,它使用注解来操作Excel的方式确实非常好用。如果你想生成更为复杂的Excel的话,可以考虑下它的模板功能。

参考资料

项目官网:/lemur/easypoi

项目源码地址

/macrozheng/mall-learning/tree/master/mall-tiny-easypoi

如果觉得《推荐一款非常好用的Excel导入导出工具EasyPoi》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。