专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

SpringStarter快速实现Excel导入导出的方法

  自我介绍IT果果
  一个普通的技术宅,欢迎点赞、关注和转发,请多关照。入门和安装简介
  为了满足项目中快速实现excel导入导出的功能,将excel开源工具easypoi整合成springbootstarter的方式,在做到对easypoi无侵入的同时减少了一些重复代码。例如:增强了easypoi对于字段值重复校验的功能;提升了字典转换的便捷性和效率;增加了字段之间联动转换的功能;
  这些场景也是我在平时项目上经常会用到的功能点,为了避免重复造轮子,减少冗余代码,所以写了一个easypoixspringbootstarter扩展jar包。安装在你的maven项目中引用maven依赖dependencygroupIdcom。itguoguogroupIdeasypoixspringbootstarterartifactIdversion1。0。0。RELEASEversiondependency在你的springboot项目配置文件中加入字典前缀(可选)itguoguo。easypoix。dictPrefixbasic:dict:工具springbootstarter
  SpringBoot核心就是几个注解:SpringBootConfiguration、EnableAutoConfiguration、ComponentScan,依赖这几个注解完成了所谓自动装配的功能,这个自动装配说简单点就是把你需要的Bean注入到Spring容器里面。(SpringBootApplication启动类上的注解,只是简单的组合了SpringBootConfiguration、EnableAutoConfiguration、ComponentScan几个注解,避免开发者一个一个的去加)。
  SpringBoot程序在启动过程中会解析SpringBootConfiguration、EnableAutoConfiguration、ComponentScan三个注解:SpringBootConfiguration:包含了Configuration注解,实现配置文件ComponentScan:指定扫描范围EnableAutoConfiguration:通过源码可以知道,该注解使用Import引入了AutoConfigurationImportSelector类,而AutoConfigurationImportSelector类通过SpringFactortisLoader加载了所有jar包的MATEINF文件夹下面的spring。factories文件,spring。factories包含了所有需要装配的XXXConfiguration类的全限定名。XXXConfiguration类包含了实例化该类需要的信息,比如说如果这是个数据源Configuration类,那么就应该有数据库驱动、用户名、密码等等信息。
  SpringBoot在启动的时候会干这几件事情:SpringBoot在启动时会去依赖的Starter包中寻找resourcesMETAINFspring。factories文件,然后根据文件中配置的Jar包去扫描项目所依赖的Jar包。根据spring。factories配置加载AutoConfigure类根据Conditional注解的条件,进行自动配置并将Bean注入SpringContext
  总结:SpringBoot并没有想象那么神秘,就是这么几件事情:
  1。提供了一个配置类,该配置类定义了我们需要的对象的实例化过程;
  2。提供了一个spring。factories文件,包含了配置类的全限定名;
  3。将配置类和spring。factories文件打包为一个启动器starter;
  4。程序启动时通过加载starter。jar包的spring。factories文件信息,然后通过反射实例化文件里面的类。easypoi
  独特的功能基于注解的导入导出,修改注解就可以修改Excel支持常用的样式自定义基于map可以灵活定义的表头字段支持一对多的导出,导入支持模板的导出,一些常见的标签,自定义标签支持HTMLExcel转换,如果模板还不能满足用户的变态需求,请用这个功能支持word的导出,支持图片,Excel
  使用1。easypoi父包作用大家都懂得2。easypoiannotation基础注解包,作用于实体对象上,拆分后方便maven多工程的依赖管理3。easypoibase导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能4。easypoiweb耦合了springmvc基于AbstractView,极大的简化springmvc下的导出功能5。sax导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poiscratchpad,都作为可选包了
  Maven坐标dependencygroupIdcn。afterturngroupIdeasypoibaseartifactIdversion4。1。0versiondependencydependencygroupIdcn。afterturngroupIdeasypoiwebartifactIdversion4。1。0versiondependencydependencygroupIdcn。afterturngroupIdeasypoiannotationartifactIdversion4。1。0versiondependency
  使用场景
  我们的目标是尽可能使用一个工具类方法就能实现简单的导出和导入Excel的功能,以下列出了几个常见的场景供参考。简单导出Excel实现步骤
  新建一个导出实体模型,ExcelFileAttr注解提供导出Excel的文件名,Excel注解提供表头的字段,其中name属性是字段名称,dict属性是字典的关键字常量DataExcelFileAttr(fileName导出。xls)publicclassExportPersonExcelModalimplementsSerializable{Excel(name姓名)privateStringname;Excel(name性别,dictDICTXB)privateStringsex;Excel(name民族,dictDICTMZ)privateStringmz;}
  使用工具类EasyPoiUtil的exportExcel方法即可实现excel导出功能,只需要传递两个参数。Excel数据列表HttpServletResponse输出流EasyPoiUtil。exportExcel(list,response);比较EasyPoi和EasyPoiX
  相对于EasyPoi官方的导出方式,EasyPoiX对于导出时字典的处理更加方便,不需要额外提供
  IExcelDictHandler实现,EasyPoi的IExcelDictHandler接口两个实现方法如下:从值翻译到名称paramdict字典Keyparamobj对象paramname属性名称paramvalue属性值returnpublicStringtoName(Stringdict,Objectobj,Stringname,Objectvalue);从名称翻译到值paramdict字典Keyparamobj对象paramname属性名称paramvalue属性值returnpublicStringtoValue(Stringdict,Objectobj,Stringname,Objectvalue);
  toName方法用于导出时字典值到字典名称的转换;toValue方法用于导入时字典名称到字典值的转换。如果使用EasyPoi,则多个字典公用一个IExcelDictHandler接口时需要多个ifelse判断,并且在Excel导入导出时重复查询同一个字典时会有效率问题,另外在项目中多个字典的查询接口往往是同一个方法,所以显得代码重复不美观。
  为了解决以上问题,EasyPoiX在导出时提供了字典转换的默认字典转换接口,且不需要在工具类中传参指定(如果有特殊要求也可以指定自定义的字典转换接口)。那么问题来了,字典的取值方法在哪里定义呢?EasyPoiX提供了一个ExcelDictDataType注解和一个ExcelDictDataService接口,代码示例如下:ExcelDictDataType({DICTXB,DICTMZ,DICTCOMMUNITY})ComponentpublicclassBasicDictDataServiceimplementsExcelDictDataServiceString,String{publicstaticfinalStringDICTXBXB;publicstaticfinalStringDICTMZMZ;OverridepublicMapString,StringgetData(DataParamparams){获取字典值的实现代码不论是字典的名称转值还是值转名称,都会从这里取值返回的Map类型,key是字典值,value是字典名称returnmap;}}IExcelDictHandler接口,要在导出方法里显示的传参;ExcelDictDataService接口不需要显示传参,因为ExcelDictDataType注解已经标注当前类就是字典取值的实现类,注解的value()属性里配置的是字典的key,可以提供多个字典的key,所以ExcelDictDataService接口可以满足多个字典的取值。IExcelDictHandler接口需要正反向两个转换方法;ExcelDictDataService接口只需要实现一个字典取值方法。IExcelDictHandler接口需要在实现方法中加入多个ifelse,并且在Excel导入导出时频繁调用toName和toValue方法会导致效率问题;ExcelDictDataService接口不需要通过ifelse判断,且每次取值都会先从本地缓存中查询,如果缓存没有才会进行真正的查询调用。在一次请求结束之后,会清除这些缓存以免造成内存不足。大数据导出Excel实现步骤
  使用工具类EasyPoiUtil的exportBigExcel方法即可实现excel大数据导出功能,传参:实体模型ClassIExcelExportServer接口。可以使用默认接口实现类DefaultBigExcelExportServer,构造方法需要提供一个分页查询的lamda表达式分页查询的条件参数,Object类型HttpServletResponse输出流DefaultBigExcelExportServersernewDefaultBigExcelExportServer((queryParams,page)findPage(queryParams,page));EasyPoiUtil。exportBigExcel(ExportPersonExcelModal。class,ser,param,response);比较EasyPoi和EasyPoiX
  EasyPoi需要实现IExcelExportServer接口,EasyPoiX不需要实现,而是传递一个DefaultBigExcelExportServer对象,构造对象时提供一个分页查询的lamda表达式
  或者叫分页查询方法。这样的好处是不需要为每一个Excel都单独新建一个IExcelExportServer接口实现类。导出数据接口publicinterfaceIExcelExportServer{查询数据接口paramqueryParams查询条件parampage当前页数从1开始returnpublicListObjectselectListForExcelExport(ObjectqueryParams,intpage);}导入Excel
  导入Excel场景相对于导出场景要复杂一些,除了调用工具类的导入方法和字典转换取值实现以外,还额外增加了两个场景:1、数据校验;2、数据处理。这两个场景都不是导入时的必选步骤,但都很常见。下面就对这两个场景详细说明一下。数据校验
  EasyPoi提供了一个数据校验接口IExcelVerifyHandler导入校验接口authorJueYue2014年6月23日下午11:08:21publicinterfaceIExcelVerifyHandlerT{导入校验方法paramobj当前对象returnpublicExcelVerifyHandlerResultverifyHandler(Tobj);}
  EasyPoiX对其进行了一个小优化,增加了数据重复的校验功能,比如导入人员名单时,出现了相同的身份证号会提示后面出现的那个身份证号重复。使用方法也很简单,只需要继承一个DefaultExcelVerifyHandler类即可,示例代码如下:ComponentpublicclassImportPersonExcelVerifyHandlerextendsDefaultExcelVerifyHandlerImportPersonExcelModal{OverridepublicExcelVerifyHandlerResultverifyHandler(ImportPersonExcelModalobj){SetObjectidCardsgetRepeatTmp(idCard);if(idCards。contains(obj。getIdCard())){returnnewExcelVerifyHandlerResult(false,证件号重复);}idCards。add(obj。getIdCard());returnnewExcelVerifyHandlerResult(true);}}
  这里要特别指出一下,返回的ExcelVerifyHandlerResult类型构造时如果success参数传true就表示校验通过;如果传false,就会在导入方法返回的导入数据中校验不通过的那个元素中,errorMsg设置为校验错误的提示信息。所以导入的实体类需要继承ImportExcelModel类。publicclassImportExcelModelimplementsSerializable,IExcelDataModel,IExcelModel{行号privateintrowNum;错误消息Excel(name错误信息)privateStringerrorMsg;OverridepublicintgetRowNum(){returnrowNum;}OverridepublicvoidsetRowNum(introwNum){this。rowNumrowNum;}OverridepublicStringgetErrorMsg(){returnerrorMsg;}OverridepublicvoidsetErrorMsg(StringerrorMsg){this。errorMsgerrorMsg;}}数据处理
  数据处理的场景其实和数据字典的场景非常相似,都是需要对excel数据做一些转换操作。但是他们的不同点在于数据字典更偏向于转换全局唯一的常量,所以Excel注解里的dict属性在不同Excel实体里都是共用的;而数据处理是在数据字典转换操作完成以后进行的,因为数据处理的字段在转换时可能会用到当前Excel行的其他字段,包括转换后的字典值。
  举个例子,比如导入的excel行数据多个字段之间存在联动查询的关系,就需要自定义数据处理了。例如导入的一行字段里有小区和楼栋,小区名称和小区id的转换不需要依赖其他字段,但是楼栋名称和楼栋id的转换是需要根据小区id查询的,虽然同样可以通过字典方式转换,但是最好还是在字典转换之后,数据处理的步骤再转换更安全。
  此外,字典转换做不到同一个关键字在不同实体里,使用不同的转换逻辑,因为字典的含义本身就是全局唯一的。而数据处理转换可以做到同一个关键字在不同实体里,使用不同的转换实现。下面用EasyPoi和EasyPoiX的两种代码实现来更加详细的介绍他们的区别。EasyPoi的数据处理
  EasyPoi提供了默认数据处理器虚类ExcelDataHandlerDefaultImplpublicabstractclassExcelDataHandlerDefaultImplTimplementsIExcelDataHandlerT{需要处理的字段privateString〔〕needHandlerFields;省略部分代码。。。。。OverridepublicObjectimportHandler(Tobj,Stringname,Objectvalue){returnvalue;}OverridepublicObjectexportHandler(Tobj,Stringname,Objectvalue){returnvalue;}OverridepublicvoidsetNeedHandlerFields(String〔〕needHandlerFields){this。needHandlerFieldsneedHandlerFields;}}setNeedHandlerFields方法用来指定哪些字段需要处理,参数是一个字符串数组,每个元素对应的是Excel实体里Excel注解的name属性,即Excel的表头名称importHandler接口可以重写为我们需要的转换逻辑,默认是返回原始value,即不转换字段exportHandler接口可以重写为我们需要的转换逻辑,默认是返回原始value,即不转换字段
  现在,继承ExcelDataHandlerDefaultImpl类就可以实现数据处理了ComponentpublicclassPersonExcelDataHandlerextendsExcelDataHandlerDefaultImplImportPersonExcelModal{PostConstructpublicvoidinit(){setNeedHandlerFields(newString〔〕{小区,楼栋});}OverridepublicObjectimportHandler(ImportPersonExcelModalobj,Stringname,Objectvalue){if(Objects。isNull(value)){returnvalue;}if(name。equals(楼栋)){根据obj。getCommunityId()和obj。getBuildingName(),查询楼栋idreturn楼栋id;}returnvalue;}OverridepublicObjectexportHandler(ImportPersonExcelModalobj,Stringname,Objectvalue){if(Objects。isNull(value)){returnvalue;}if(name。equals(楼栋)){根据obj。getCommunityId()和obj。getBuildingId(),查询楼栋名称return楼栋名称;}returnvalue;}}EasyPoiX的数据处理
  EasyPoiX封装了一个SimpleExcelDataHandler虚类,继承这个虚类就可以免去手动调用setNeedHandlerFields方法的麻烦。
  另外,SimpleExcelDataHandler默认提供了importHandler和exportHandler两个接口的实现,同字典转换一样,只需要提供一个getData接口的实现,提供待处理数据的取值逻辑即可。ComponentExcelHandleDataType(clazzImportPersonExcelModal。class,value{BUILDINGNAME,UNITNAME})publicclassPersonExcelDataHandlerextendsSimpleExcelDataHandlerImportPersonExcelModal{publicstaticfinalStringBUILDINGNAME楼栋;publicstaticfinalStringUNITNAME单元;OverridepublicMapString,StringgetData(DataParamparams){switch(params。getDict()){caseBUILDINGNAME:returngetBuildingData(params);caseUNITNAME:returngetUnitData(params);default:returnnull;}}privateMapString,StringgetBuildingData(DataParamparams){Objectrowparams。getRow();StringcommunityIdBeanUtil。getProperty(row,communityId);返回楼栋键值对,key是楼栋id,value是楼栋名称}privateMapString,StringgetUnitData(DataParamparams){Objectrowparams。getRow();StringbuildingIdBeanUtil。getProperty(row,buildingId);返回单元键值对,key是单元id,value是单元名称}}
  DataParam。javaDataAccessors(chaintrue)publicclassDataParam{privateStringdict;privateStringkey;privateObjectrow;}
  如果实际业务不需要默认的数据处理实现,也可以在继承SimpleExcelDataHandler虚类之后,重写importHandler和exportHandler接口,就像EasyPoi的数据处理方式一样,这样更加灵活。总结
  EasyPoiX是为了能够快速导入导出Excel,而对EasyPoi进行的一个无侵入的二次封装,同时利用了springbootstarter的原理,使其在springboot项目中可以以jar模块的形式复用EasyPoiX的功能。如果有小伙伴在实际的使用中遇到了其他场景,也可以联系我。
  我叫IT果果,下面有我的联系方式,谢谢!请联系我IT果果
  一个普通的技术宅,欢迎点赞、关注和转发,请多关照。
  以上场景都有对应的测试代码示例,如果想更进一步了解请访问地址:
  https:gitee。comchenzhaopluseasypoixspringbootstarter
  https:github。comchenzhaopluseasypoixspringbootstarter
  https:blog。csdn。netcz285933169?spm1010。2135。3001。5421

如何根据孕期反应推断宝宝性别?如何根据孕期反应推断宝宝性别?很多老年人会通过女性怀孕后的一些行为和身体特征来判断怀的是男孩还是女孩,这些判断有什么依据吗?根据孕期反应,真的能判断出孩子的性别吗?其实孕期反应和宝宝宝几个月后,才可以不用拍嗝了?十月怀胎时准妈妈是紧张又忐忑不安的,可一朝分娩之后在漫长的育儿路上尤其是婴儿时期可以宝妈是焦虑的,如果你是新手妈妈这种焦虑不安的感觉会相当的强烈。作为宝妈们宝宝一般是几个月以后就不8988元起售!华为P60Art值得入手吗?众所周知,华为P60系列旗舰手机已经在3月23日正式发布,共包括P60P60ProP60Art三款新机,其中P60Art定义为顶配机型,拥有着独特的外观设计以及独有的1TB存储规格十大轻量级linux系统?以下是十大轻量级Linux系统Lubuntu基于Ubuntu,使用LXQt桌面环境,非常轻量级。PuppyLinux非常小巧的Linux发行版,可以在旧电脑上运行,它的ISO文件大外媒爆料微软新Windows系统将提高门槛,老设备恐淘汰百能云芯微软有意把Windows系统的开发周期与升级节奏步调,改为每三年推出重磅升级的大型版本。继先前传出微软已着手展开下一代作业系统的开发部署,最快有望于明年2024年底前登场。WindCCSInsight预测今年全球手机出货量将跌至10多年来的最低点据TelecomTV3月27日报道,研究机构CCSInsight的最新预测显示,今年全球手机出货量将跌至10多年来的最低点,然而,尽管面临全球经济压力,新型5G手机的销售预计仍将保初次佩戴爱唯听助听器,如何缓解不适对于初次佩戴爱唯听助听器的人来说,可能会有一些不适应感。这些不适应感可能包括听力变化佩戴的压力或不适对新的声音环境的适应等。但是,一旦适应了助听器,它们会大大提高听力和生活质量。以做windows界面,用QT还是MFC?使用Qt吧,前提是在这两者下进行选择。既然提到了Qt和MFC,我想题主肯定是一个C的开发者。其实,在我看来,Windows下开发界面程序,还有很多其他的选择。下面我就连同QtMFC麒麟990集成5g和麒麟990外挂巴龙5000差距大吗?麒麟990集成5G和麒麟990外挂巴龙5000差距大吗?那下面我给大家说一下这两款芯片有什么区别,在做一下对比。1。麒麟9905G搭载这款处理器的手机,目前有华为Mate30Pro一般排卵日在月经的什么时候?最简单的方法是怎么计算的?感谢邀请,我是京妈说,很高兴回答您的问题。对于孕育期的女性来说,想要成功怀上宝宝,找准排卵日是最重要的一个环节。通常初次怀孕的女性对排卵日并不是很敏感,她们怀孕大多是顺其自然,只有糖尿病吃大蒜能降血糖吗?如何吃才有效果?感谢邀请。糖尿病患者吃大蒜不能直接起到降糖的效果,大蒜中或有一些活性物质有助于血糖的控制,但光靠吃大蒜并不能稳定血糖,即使吃了算,糖友还是应当保证降糖药的摄入,胰岛素注射量也不要减
索尼电视国行新品上架X80L5499元起,X90L7499元起IT之家3月9日消息,索尼上周在海外推出了2023款BRAVIAXR电视新品阵容,包含MiniLED电视X95L全阵列式LED电视X90L量子点OLED电视A95LOLED电视A82023沧州雄狮三大关键词准入主场外援记者陈永报道众多中超俱乐部中,沧州雄狮一直比较低调。事实上,他们在中超联赛中也曾经有过不错的表现2015赛季成为中超黑马,2020赛季回归中超之后,他们在2021赛季和上赛季后半段隋朝的历史教育是如何开展的?当时的教育对后世产生了怎样的影响阅读此文前,麻烦您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。引言在中国的历朝历代中,隋朝国运短祚,这一点为众人所知晓。但为我们所忽视的是,在隋朝如果鸿门宴刘邦被项羽杀死后,接下来的历史会如何发展?项羽和刘邦是中国历史上著名的两位人物,他们分别代表了楚汉两大势力。公元前206年,刘邦率领汉军攻入洛阳,逼迫秦朝的末代皇帝子婴自杀,随后他在与项羽的争夺中获胜,建立了汉朝。但是,如秦齐互帝对中国历史的影响秦齐互帝对中国历史的影响前言秦齐互帝是中国历史上的一件重要事件,发生在春秋战国时期。在这场战争中,秦国和齐国互相称帝,进行了长达十年的激烈战争,最终以秦国战胜齐国而结束。本文通过对再创历史!吴易昺拿下海外大师赛正赛首胜文羊城晚报全媒体记者龙希北京时间3月9日,在ATP1000男子网球巡回赛印第安维尔斯站的男单第一轮比赛中,吴易昺以6比76比07比6逆转击败了西班牙选手穆纳尔,这是中国大陆男子网球文史夏伯渝无尽攀登在险峰作者王元对于夏伯渝来说,参加2022年北京冬残奥会的开幕式演出是人生中攀登的又一座高峰在世人注目下,他身穿冲锋衣,手持登山杖,在开幕式舞台上,和孩子们一起攀登和飞翔。作为无腿登顶珠汉武帝身边的西汉名人东方朔,为什么年年换媳妇?大智若愚还是?汉武帝刘彻汉武帝在位的时候,西汉人才辈出。除了卫青和霍去病,还有许多政治家和文学家。他们共同编织了汉诗的辉煌。在汉武帝身边,就有这样一位特殊的弄臣。他被司马迁列入史记。滑稽列传。有株洲太子奶事件,幕后黑手凌娅主动投案后,李途纯再度重拳出击近日株洲太子奶事件,因警告为03008的凌娅主动投案,备受广大网友关注。而李途纯在凌娅主动投案后,对其再度重拳出击,爆料更多凌娅不为人知的事,让观众吃瓜不断,也三观尽毁。2022年汉武帝空手套白狼玩得妙前面我们说过,武帝想要加强中央集权,那就势必要削弱地方诸侯。景帝时,不是没这么干过,可是引发了七国之乱。如此看来,皇帝直接下旨削藩,是行不通的。能不能有一个办法,让诸侯国主动削藩,汉武帝所设立的中外朝对相权的制衡有多大历史开讲在阅读此文前,诚邀您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。相,在中国古代历史有着举足轻重的地位,最早由齐景公所设置的官职,其目的是为
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网