当前位置: 首页 > 科技观察

SpringBoot实现Excel导入导出,好用到POI都能丢!

时间:2023-03-22 15:59:32 科技观察

EasyPoi介绍用惯了SpringBoot的朋友可能会想,有没有办法直接定义需要导出的数据对象,然后加上几个注解,直接自动实现Excel导入导出功能呢?EasyPoi就是这样一个工具。如果你对POI不熟悉,想轻松实现Excel操作,就用它吧!EasyPoi的目标不是取代POI,而是让一个不会导入导出的人也能快速使用POI完成Excel中的各种操作,而不是看很多API来完成这样的工作。集成在SpringBoot中集成EasyPoi非常简单,只需添加如下依赖即可,真是开箱即用!cn.afterturneasypoi-spring-boot-starter4.4.0使用接下来介绍EasyPoi的使用,以会员信息和订单信息的导入导出为例,分别实现了简单的单表导出和关联信息的复杂导出。简单导出下面以导出会员信息列表为例,使用EasyPoi实现导出功能,看看是不是够简单!首先创建一个会员对象Member来封装会员信息;/***购物会员*创建者macroon2021/10/12.*/@Data@EqualsAndHashCode(callSuper=false)publicclassMember{@Excel(name="ID",width=10)privateLongid;@Excel(name="username",width=20,needMerge=true)privateStringusername;privateStringpassword;@Excel(name="nickname",width=20,needMerge=true)privateStringnickname;@Excel(name="birthDate",width=20,format="yyyy-MM-dd")privateDatebirthday;@Excel(name="手机号",width=20,needMerge=true,desensitizationRule="3_4")privateStringphone;privateStringicon;@Excel(name="性别",width=10,replace={"male_0","female_1"})privateIntegergender;}这里我们可以看到EasyPoi的核心注解@Excel,通过在对象注解中添加@Excel,可以直接将对象信息导出到Excel,下面是介绍注释中的属性;name:Excel中的列名;width:指定列的宽度;needMerge:是否垂直合并单元格;format:当属性为时间类型时,设置时间的导出格式;desensitizationRule:数据脱敏处理,3_4表示只显示字符串的前3位和后4位,其他这是*;replace:替换属性;后缀:为数据添加后缀接下来,我们在Controller中添加一个接口,用于将成员列表导出到Excel。具体代码如下;,description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation(value="export成员列表Excel")@RequestMapping(value="/exportMemberList",method=RequestMethod.GET)publicvoidexportMemberList(ModelMapmap,HttpServletRequestrequest,HttpServletResponseresponse){ListmemberList=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*Createdbymacroon2021/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{Listlist=ExcelImportUtil.importExcel(file.getInputStream(),Member.class,params);returnCommonResult.success(list);}catch(Exceptione){e.printStackTrace();returnCommonResult.failed("Importfailed!");}}}然后在Swagger中测试接口,只需要选择之前导出的Excel文件即可,导入成功后会返回解析后的数据。复杂导出当然,EasyPoi还可以实现更复杂的Excel操作,比如导出嵌套了会员信息和商品信息的订单列表,下面来实现一下!首先添加产品对象Product,用于封装产品信息;/***Product*Createdbymacroon2021/10/12.*/@Data@EqualsAndHashCode(callSuper=false)publicclassProduct{@Excel(name="ID",width=10)privateLongid;@Excel(name="productSN",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是我们需要导出Data的嵌套顺序;/***Order*Createdbymacroon2021/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="MemberInformation")privateMembermember;@ExcelCollection(name="ProductList")privateListproductList;}接下来在Controller中添加一个导出订单列表的接口,因为有些会员信息我们如果不需要导出,可以调用ExportParams中的setExclusions方法排除;/***EasyPoi导入导出测试Controller*Createdbymacroon2021/10/12.*/@Controller@Api(tags="EasyPoiController",description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation(value="exportorderlistExcel")@RequestMapping(value="/exportOrderList",method=RequestMethod.GET)publicvoidexportOrderList(ModelMapmap,HttpServletRequestrequest,HttpServletResponseresponse){ListorderList=getOrderList();ExportParamsparams=newExportParams("订单列表","订单列表",ExcelType.XSSF);//导出时排除部分字段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方法中实现自定义的处理逻辑;/***自定义字段处理*Createdbymacroon2021/10/13.*/publicclassMemberExcelDataHandlerextendsExcelDataHandlerDefaultImpl{@OverridepublicObjectexportHandler(Memberobj,Stringname,Objectvalue){if("nickname".equals(name)){StringemptyValue="notyetset";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设置需要自定义的字段,调用ExportParams的setDataHandler设置自定义处理器;/***EasyPoi导入导出测试Controller*Createdbymacroon2021/10/12.*/@Controller@Api(tags="EasyPoiController",description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation(value="ExportmemberlistExcel")@RequestMapping(value="/exportMemberList",method=RequestMethod.GET)publicvoidexportMemberList(ModelMapmap,HttpServletRequestrequest,HttpServletResponseresponse){List成员=LocalJsonUtil.getListFromJson("json/members.json",Member.class);ExportParamsparams=newExportParams("MemberList","MemberList",ExcelType.XSSF);//自定义导出结果MemberExcelDataHandlerhandler=newMemberExcelDataHandler();handler.setNeedHandlerFields(newString[]{"nickname"});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,可以考虑它的模板功能。

最新推荐
猜你喜欢