使用自定义注解加反射抽取导出execl公共类
前两天要做一个导出execl的功能,当然使用poi导出execl网上有许多公共类,我这里也是借用别人的帮助类,不过我现在要说的是使用帮助类之前的那部分操作。
实现的业务场景:页面数据需要导出到execl表中,如下:
再如下:
就是说需要单独设置表头,并且填充数据。但是这些步骤都是重复的,所以我就在想有没有可能做到,自动设置表头和填充数据,这样做的难点就是在于表头如何设置,每个execl的表头是不一样的。
那么我就说说我的做法,设置表头,我想有没有可能给个实体类就可以知道设置那些表头,表头的文字怎么写,然后我就想表头的文字可以通过注释上的文字表示,然后我想到了注解和反射。
1.我的代码需要自定义一个注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* <p>ExportExcelAnnotaion</p>
*
* <p>描述:</p>
*
* <p>备注:</p>
*
* <p>2016年11月18日 上午10:39:26</p>
*
* @author wang.changjiu
*
* @version 1.0.0
*
*/
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExportExcelAnnotaion {
String fieldAnnotate();
}
该注解的目的有两个:
(1) 使用该注解表示的字段是需要导出到execl表中的列数据
(2) 使用该注解可以取到设置表头上的文字。
2.然后,在实体类上需要添加注解:
可以看到注解上fieldAnnotate = “颁发媒体”。。。这些文字是需要设置到表头上的。
3.抽取一个baseController
package com.df.ecoland.bm.controller;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import com.df.ecoland.bm.domain.AwardsDeclare;
import com.df.ecoland.oc.domain.cust.CustOcPartner;
import com.df.framework.annotation.ExportExcelAnnotaion;
import com.df.framework.base.controller.BaseController;
import com.df.framework.excel.HSSFExcel;
import com.df.framework.util.ExcelHelper;
/**
* <p>BmExportBaseController</p>
*
* <p>描述:</p>
*
* <p>备注:</p>
*
* <p>2016年11月18日 上午11:24:46</p>
*
* @author wang.changjiu
*
* @version 1.0.0
*
*/
public class BmExportBaseController<T> extends BaseController{
public T getEntity(T t) {
Field[] fields = t.getClass().getDeclaredFields();
if(fields!=null) {
for (Field field : fields) {
if(!field.isAccessible()) {
field.setAccessible(true);
}
Export
前两天要做一个导出execl的功能,当然使用poi导出execl网上有许多公共类,我这里也是借用别人的帮助类,不过我现在要说的是使用帮助类之前的那部分操作。
实现的业务场景:页面数据需要导出到execl表中,如下:
再如下:
而这三个页面都需要导出到execl表中,然而导出的代码是非常相似的。先来看看导出的写法,上代码:
就是说需要单独设置表头,并且填充数据。但是这些步骤都是重复的,所以我就在想有没有可能做到,自动设置表头和填充数据,这样做的难点就是在于表头如何设置,每个execl的表头是不一样的。
那么我就说说我的做法,设置表头,我想有没有可能给个实体类就可以知道设置那些表头,表头的文字怎么写,然后我就想表头的文字可以通过注释上的文字表示,然后我想到了注解和反射。
1.我的代码需要自定义一个注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* <p>ExportExcelAnnotaion</p>
*
* <p>描述:</p>
*
* <p>备注:</p>
*
* <p>2016年11月18日 上午10:39:26</p>
*
* @author wang.changjiu
*
* @version 1.0.0
*
*/
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExportExcelAnnotaion {
String fieldAnnotate();
}
该注解的目的有两个:
(1) 使用该注解表示的字段是需要导出到execl表中的列数据
(2) 使用该注解可以取到设置表头上的文字。
2.然后,在实体类上需要添加注解:
可以看到注解上fieldAnnotate = “颁发媒体”。。。这些文字是需要设置到表头上的。
3.抽取一个baseController
package com.df.ecoland.bm.controller;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import com.df.ecoland.bm.domain.AwardsDeclare;
import com.df.ecoland.oc.domain.cust.CustOcPartner;
import com.df.framework.annotation.ExportExcelAnnotaion;
import com.df.framework.base.controller.BaseController;
import com.df.framework.excel.HSSFExcel;
import com.df.framework.util.ExcelHelper;
/**
* <p>BmExportBaseController</p>
*
* <p>描述:</p>
*
* <p>备注:</p>
*
* <p>2016年11月18日 上午11:24:46</p>
*
* @author wang.changjiu
*
* @version 1.0.0
*
*/
public class BmExportBaseController<T> extends BaseController{
public T getEntity(T t) {
Field[] fields = t.getClass().getDeclaredFields();
if(fields!=null) {
for (Field field : fields) {
if(!field.isAccessible()) {
field.setAccessible(true);
}
Export