在日常工作中,我们经常会遇到操作Excel的功能,比如导出用户信息或订单信息的Excel报表。你一定听说过POI,它是可以实现的。但是POI实现的API实在是太麻烦了,需要一行一行的写解析代码(类似于Xml解析)。今天给大家推荐一款非常好用的Excel导入导出工具EasyPoi,希望对大家有所帮助!SpringBoot实战电商项目商城(50k+star)地址:https://github.com/macrozheng/mallEasyPoi简介用惯了SpringBoot的朋友可能会觉得没办法直接定义需要的数据对象导出,然后加几个注解就可以直接自动实现Excel导入导出功能了?EasyPoi就是这样一个工具。如果你对POI不熟悉,想轻松实现Excel操作,就用它吧!EasyPoi的目标不是取代POI,而是让一个不会导入导出的人也能快速使用POI完成Excel中的各种操作,而不是看很多API来完成这样的工作。集成在SpringBoot中集成EasyPoi非常简单,只需添加如下依赖即可,真是开箱即用!cn.afterturneasypoi-spring-boot-starter4.4.0使用接下来介绍EasyPoi的使用,以会员信息和订单信息的导入导出为例,分别实现了简单的单表导出和关联信息的复杂导出。简单导出下面以导出会员信息列表为例,使用EasyPoi实现导出功能,看看是不是够简单!首先创建一个会员对象Member来封装会员信息;/***购物会员*宏创建于2021/10/12.*/@Data@EqualsAndHashCode(callSuper=false)publicclassMember{@Excel(name="ID",width=10)privateLongid;@Excel(name="用户名",width=20,needMerge=true)privateStringusername;私有字符串密码;@Excel(name="昵称",width=20,needMerge=true)privateStringnickname;@Excel(name="DateofBirth",width=20,format="yyyy-MM-dd")privateDatebirthday;@Excel(name="手机号码",width=20,needMerge=true,desensitizationRule="3_4")privateStringphone;私人字符串图标;@Excel(name="Gender",width=10,replace={"Male_0","Female_1"})privateIntegergender;}这里可以看到EasyPoi的核心注解@Excel。通过为对象添加@Excel注解,可以将对象信息直接导出到Excel中。下面是对注解中属性的介绍;名称:Excel中的列名称;width:指定列的宽度;needMerge:单元格是否需要垂直合并;format:当属性为时间类型时,设置时间的导出格式;desensitizationRule:数据脱敏处理,3_4表示只显示字符串的前3位和后4位,其他为*;replace:替换属性;秒后缀:为数据添加后缀接下来我们在Controller中添加一个将成员列表导出到Excel的接口,具体代码如下;/***EasyPoi导入导出测试Controller*宏创建于2021/10/12。*/@Controller@Api(tags="EasyPoiController",description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation(value="导出成员列表Excel")@RequestMapping(value="/exportMemberList",method=RequestMethod.GET)publicvoidexportMemberList(ModelMapmap,HttpServletRequestrequest,HttpServletResponseresponse){ListmemberList=LocalJsonUtil.getListFromJson("json/members.json",Member.class);}ExportParams"params=newMemberList","MemberList",ExcelType.XSSF);map.put(NormalExcelConstants.DATA_LIST,memberList);map.put(NormalExcelConstants.CLASS,Member.class);map.put(NormalExcelConstants.PARAMS,参数);map.put(NormalExcelConstants.FILE_NAME,"memberList");PoiBaseView.render(地图,请求,响应,NormalExcelConstants.EASYPOI_EXCEL_VIEW);}}LocalJsonUtil工具类,可以直接从resources目录下获取JSON数据,并转化为对象,比如这里使用的members.json;直接通过SwaggerAccess接口运行项目,注意Swagger中的访问接口不能直接下载,需要在返回结果中点击下载按钮,访问地址:http://localhost:8088/swagger...下载完成,查看文件,一个标准的Excel文件已经导出。简单导入导入功能实现起来也非常简单。下面以导入会员信息列表为例。在Controller中添加会员信息导入接口。这里要注意@RequestPart注解是用来修改文件上传参数的,否则在Swagger中无法显示上传按钮;/***EasyPoi导入导出测试Controller*宏创建于2021/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);参数.setHeadRows(1);尝试{Listlist=ExcelImportUtil.importExcel(file.getInputStream(),Member.class,params);返回CommonResult.success(列表);}catch(Exceptione){e.printStackTrace();returnCommonResult.failed("导入失败!");然后在Swagger中测试界面,选择之前导出的Excel文件没问题,导入成功后会返回解析后的数据。复杂导出当然,EasyPoi还可以实现更复杂的Excel操作,比如导出嵌套了会员信息和商品信息的订单列表,下面来实现一下!首先添加产品对象Product,用于封装产品信息;/***产品*由宏创建于2021/10/12。*/@Data@EqualsAndHashCode(callSuper=false)publicclassProduct{@Excel(name="ID",width=10)privateLongid;@Excel(name="产品序列号",width=20)privateStringproductSn;@Excel(name="产品名称",width=20)privateStringname;@Excel(name="产品副标题",width=30)privateStringsubTitle;@Excel(name="BrandName",width=20)privateStringbrandName;@Excel(name="ProductPrice",width=10)privateBigDecimalprice;@Excel(name="PurchaseQuantity",width=10,suffix="Pieces")privateIntegercount;}然后添加订单对象Order,order和member是一对一的关系,使用@ExcelEntity注解,order和product是一对多关系,用@ExcelCollection注解表示,Order是我们需要导出的嵌套订单数据;/***订单*由宏创建于2021/10/12。*/@Data@EqualsAndHashCode(callSuper=false)publicclassOrder{@Excel(name="ID",width=10,needMerge=true)privateLongid;@Excel(name="订单号",宽度=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="会员信息")私人会员member;@ExcelCollection(name="ProductList")privateListproductList;}接下来在Controller中添加导出订单列表的接口。由于我们不需要导出一些会员信息,所以可以调用ExportParams中的setExclusions方法进行排除;/***EasyPoi导入导出测试Controller*宏创建于2021/10/12。*/@Controller@Api(tags="EasyPoiController",description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation(value="导出订单列表Excel")@RequestMapping(value="/exportOrderList",method=RequestMethod.GET)publicvoidexportOrderList(ModelMapmap,HttpServletRequestrequest,HttpServletResponseresponse){列表<订单>orderList=getOrderList();ExportParamsparams=newExportParams("订单列表","订单列表",ExcelType.XSSF);//导出时排除部分字段params.setExclusions(newString[]{"ID","DateofBirth","Gender"});map.put(NormalExcelConstants.DATA_LIST,orderList);map.put(NormalExcelConstants.CLASS,Order.class);map.put(NormalExcelConstants.PARAMS,参数);map.put(NormalExcelConstants.FILE_NAME,"orderList");PoiBaseView.render(地图、请求、响应、NormalExcelConstants.EASYPOI_EXCEL_VIEW);}}在Swagger中访问接口测试,导出Excel对应的订单列表;下载完成后,查看文件,EasyPoi导出复杂Excel也很简单!自定义处理如果你想对导出的字段做一些自定义处理,EasyPoi也支持。比如在会员信息中,如果用户没有设置昵称,我们会添加还没有设置的信息我们需要添加一个处理器来继承默认的ExcelDataHandlerDefaultImpl类,然后在exportHandler方法中实现自定义的处理逻辑;/***自定义字段处理*宏创建于2021/10/13。*/publicclassMemberExcelDataHandlerextendsExcelDataHandlerDefaultImpl{@OverridepublicObjectexportHandler(Memberobj,Stringname,Objectvalue){if("nickname".equals(name)){StringemptyValue="notsetyet";}if(value==null){returnsuper.exportHandler(obj,name,emptyValue);}if(valueinstanceofString&&StrUtil.isBlank((String)value)){returnsuper.exportHandler(obj,name,emptyValue);}}返回super.exportHandler(obj,name,value);}@OverridepublicObjectimportHandler(Memberobj,Stringname,Objectvalue){returnsuper.importHandler(obj,name,value);然后在Controller中修改接口,调用MemberExcelDataHandler处理器的setNeedHandlerFields设置需要自定义处理的字段,调用ExportParams的setDataHandler设置自定义handler;/***EasyPoi导入导出测试Controller*宏创建于2021/10/12。*/@控制器r@Api(tags="EasyPoiController",description="EasyPoi导入导出测试")@RequestMapping("/easyPoi")publicclassEasyPoiController{@ApiOperation(value="导出成员列表Excel")@RequestMapping(value="/exportMemberList",method=RequestMethod.GET)publicvoidexportMemberList(ModelMapmap,HttpServletRequestrequest,HttpServletResponseresponse){ListmemberList=LocalJsonUtil.getListFromJson("json/members.json",newMember.class);}ExportParam=ExportParams("会员列表","会员列表",ExcelType.XSSF);//自定义导出结果MemberExcelDataHandlerhandler=newMemberExcelDataHandler();handler.setNeedHandlerFields(newString[]{"Nickname"});参数.setDataHandler(处理程序);map.put(NormalExcelConstants.DATA_LIST,memberList);map.put(NormalExcelConstants.CLASS,Member.class);map.put(NormalExcelConstants.PARAMS,参数);map.put(NormalExcelConstants.FILE_NAME,"memberList");PoiBaseView.render(地图、请求、响应、NormalExcelConstants.EASYPOI_EXCEL_VIEW);}}再次调用导出接口,可以发现昵称已经添加到默认设置中了。总结体验了一波EasyPoi,它用批注操作Excel的方式真的很好用。如果要生成比较复杂的Excel,可以考虑它的模板功能。参考项目官网:https://gitee.com/lemur/easypoi项目源码地址https://github.com/macrozheng...本文的githubhttps://github.com/macrozheng/mall-learning有已收录,欢迎大家star!