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

Java高级特性——注解:注解实现Excel导出功能

时间:2023-03-12 22:55:59 科技观察

注解是Java的一个高级特性,Spring基于注解开发了一套“注解驱动编程”。这听起来很高大上,但毕竟是框架的问题,是不是也可以用好注解呢?确实,我们很少有机会自己写注解,所以我们不知道注解是什么,更不用说用好它们了。本例中,我们将从具体工作入手,开发一个Excel导出功能。相信大家看懂这个例子后,就能明白注解是怎么用的了。Excel导出——需求拆解在后台管理系统中,经常需要将数据导出到Excel表格中。比如双十一之后,销售部需要把产品订单录入Excel表,财务部需要把付款单录入Excel表,然后各个部门汇总分析,最后找个时间讨论如何改进公司的服务。你想想,双十一有几万单,人工录入至少要三四天,而且很容易出错。因此,您必须开发Excel导出功能。那么,怎么做呢?上次我们讲到,注解要发挥作用,有定义、使用、阅读三个要素。本次我们将利用批注的三大特性来实现Excel的导出功能。设计过程是这样的。第一步,我们创建不同的Excel模型。双十一之后,销售部需要订单数据,财务部需要支付数据。两个部门需要的Excel表格一定是不一样的。这就需要为每个部门创建不同的Excel模型来获取他们想要的数据。第二步,我们需要根据Excel模型导出Excel表格。看到这里,你应该明白Excel导出的设计流程了。接下来,我们将一步步实现这个功能。创建Excel模型创建Excel模型涉及注释三个元素的定义和使用。首先定义Excel注解,我们直接看关键代码。@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public@interfaceExcelField{/***导出字段标题*/Stringtitle();/***导出字段排序(升序)*/intsort()default0;/***Alignment(0:automatic;1:left;2:center;3:right)*/intalign()default0;}这里使用了两个元注解@Retention和@Target。@Target表示这个注解只能放在成员变量上;@Retention表示这个注解应该被加载到JVM内存中,我们可以使用反射来读取这个注解。另外,注解还有3个成员变量,分别对应:Excel字段标题、字段排序、对齐方式,方便你对表格进行微调。至此,Excel注解的定义就完成了。接下来使用注解,我们还是直接看代码。publicclassOrderModel{@ExcelField(title="ordernumber",align=2,sort=20)privateStringorderNo;@ExcelField(title="amount",align=2,sort=20)privateStringamount;//创建时间privateDatecreateTime;//省略getter/setter方法}订单模型有3个字段:订单号、金额、创建时间,但这里只给订单号和金额加上注解,表示这两个字段会导出Excel表格,创建时间会被忽略,你可以看看这张图。至此,我们就完成了注解的定义,使用注解,得到了一个Excel模型。但是要实现导出功能,必须按照这个模型生成Excel表格。读取Excel模型读取Excel模型涉及读取注释的三个元素。我们需要读取注释并生成Excel表格,主要分为3步:初始化Excel表格对象—>向Excel表格对象写入数据—>输出文件。第一步是初始化Excel表格对象。在这一步中,我们需要根据Excel模型生成一个Excel表格对象,我们需要创建这些东西:标题,表头,样式等等。让我们看一下代码。publicclassExcelExporter{//...省略无数代码/***********************************************************************************************//***构造函数*@paramtitle表标题,传“空值”,表示没有标题*@paramclsexcel模型对象*/publicExcelExporter(Stringtitle,Classcls){//获取注解listField[]fs=cls.getDeclaredFields();for(Fieldf:fs){ExcelFieldef=f.getAnnotation(ExcelField.class);if(ef!=null){annotationList.add(newObject[]{ef,f});}}注释列表。sort(comparing(o->((ExcelField)o[0]).sort()));//通过注解获取表格HeaderListheaderList=newArrayList<>();for(Object[]os:annotationList){Stringt=((ExcelField)os[0]).title();headerList.add(t);}//初始化Excel表格:创建excel表格,添加表格标题,创建表格表头等initialize(title,headerList);}}在初始化的时候,我们先从Excel模型对象中读取注解,得到注解列表;然后,从annotations列表中,读取title-field标题;最后,初始化Excel表格对象,包括:创建Excel表格对象,添加表格标题,创建表格表头,添加样式。第二步,向Excel表格对象写入数据。在这一步中,我们需要将Java列表数据写入到Excel表格对象中,以便将这些数据转化为Excel表格中的行信息。还是看代码吧。publicclassExcelExporter{/*********************************初始化Excel表格对象*******************************///...省略无数代码/*****************************向Excel表格对象写入数据*********************************//***写入数据*@returnlistdataList*/publicExcelExportersetDataList(Listlist){for(EdataObj:list){//添加行Rowrow=this.addRow();//获取数据写入单元格intcellNo=0;for(Object[]os:annotationList){//获取成员变量的值Objectvalue=null;try{value=Reflections.invokeGetter(dataObj,((Field)os[1]).getName());}catch(Exceptionex){log.info(ex.toString());value="";}if(value==null){value="";}//写入单元格ExcelFieldef=(ExcelField)os[0];this.addCell(row,cellNo++,value,ef.align());}}returnthis;}}我们先传入一个数据列表dataList,然后用循环遍历dataList。在这个循环中,我们继续往Excel表格对象中写入数据,具体操作是:新建一个空白行,使用注解获取成员变量中的值,最后写入Excel表格的单元格中.第三步是输出文件。在这一步中,Excel表格对象就变成了一个文件,我们来看看最终的代码。publicclassExcelExporter{/*********************************初始化Excel表格对象*******************************///...省略无数代码/*****************************向Excel表格对象写入数据*********************************///...省略无数代码/*********************************************************************************************************************//***输出到文件*@paramfileName输出文件名,加上绝对路径*/publicExcelExporterwriteFile(StringfileName)throwsIOException{FileOutputStreamos=newFileOutputStream(fileName);this.write(os);返回此;}}输出文件没什么好说的,就是指定文件名,然后把文件输出到指定的地方。至此,读取??Excel模型就完成了。当然,读取Excel模型涉及读取注解,这是最难理解的部分,因为读取注解需要Java的另一个高级特性——反射。而且注解一般用来简化业务。如果对业务没有深入的了解,是很难用好它们的。限于篇幅,只讲核心代码。项目完整代码放在文末链接。你可以好好看看。写在最后的注释中有三个要素可以发挥作用:定义、使用和阅读。本文使用批注三要素实现Excel导出功能。这是分两步完成的。第一步是创建Excel模型,涉及到标注三要素的定义和使用;第二步是读取Excel模型,涉及到批注三要素的读取。总之,注解一般用来简化业务。要想用好注解,不仅要掌握Java的高级用法,还要对业务有深刻的理解。