java反射构建excel导出工具类

2018-09-19 02:47:09来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一、定义注解,用于vo类中标记使用到的属性

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author fc
* @date 2018-09-18
*/
@Target(value = {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Allow {
String title() default "undefined";
}
二、反射工具类
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;

/**
* @author fc
* @date 2018-09-18
* @msg 反射工具类
* @tips 字段必须使用@Allow注解 title属性定义标题
*/
public class ExcelCreateUtil {
/**
*
* @param o object是vo类
* @param suf 返回的excel文件后缀
* @return
* @throws Exception
*/
public static Workbook createWorkBook(List<Object> o,ReturnSuf suf) throws Exception {
//定义一个新的工作簿
Workbook wb = suf.getValue().equals(ReturnSuf.XLSX.getValue())?new XSSFWorkbook():new HSSFWorkbook();
//创建sheet
Sheet sheet = wb.createSheet(String.valueOf(System.currentTimeMillis()));
//创建行
Row row = sheet.createRow(0);
//第一行以注解@Allow title属性命名

Class<?> aClass = o.get(0).getClass();
Field[] fields1 = aClass.getDeclaredFields();
int bj2 = 0;
for (int j = 0; j < fields1.length; j++) {
Allow annotation = fields1[j].getAnnotation(Allow.class);
if (annotation != null) {
fields1[j].setAccessible(true);
row.createCell(bj2).setCellValue(annotation.title());
bj2++;
}
}
int bj1 = 1;
for (int i = 0; i < o.size(); i++) {
//获取当前对象
Object o1 = o.get(i);
//获取当前类类型
Class<?> c = o.get(i).getClass();
//获取当前类类型的所有属性
Field[] fields = c.getDeclaredFields();
//创建行-从第二行起
Row row1 = sheet.createRow(bj1);
bj1++;
int bj = 0;
for (int j = 0; j < fields.length; j++) {
Allow annotation = fields1[j].getAnnotation(Allow.class);
if (annotation != null) {
fields[j].setAccessible(true);
//得到属性名
String name = fields[j].getName();
//获取属性对应的get方法
Method method = c.getDeclaredMethod(toGet(name));
Object invoke = method.invoke(o1);
String value = invoke == null ? "" : invoke.toString();
//赋值
row1.createCell(bj).setCellValue(value);
bj++;
}
}
}
return wb;
}

//获取属性的set方法
public static String toSet(String s) {
final String SET = "set";
if (Character.isUpperCase(s.charAt(0))) {
return SET + s;
} else {
return SET + (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
}
}

//获取属性的get方法
public static String toGet(String s) {
final String GET = "get";
if (Character.isUpperCase(s.charAt(0))) {
return GET + s;
} else {
return GET + (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
}
}

public enum ReturnSuf {
XLS(".xls后缀", ".xls"),
/**
*大数据量建议使用.xlsx
*/
XLSX(".xlsx后缀", ".xlsx"),;
private String key;
private String value;

ReturnSuf(String key, String value) {
this.key = key;
this.value = value;
}

public String getKey() {
return key;
}

public void setKey(String key) {
this.key = key;
}

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}
}
}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:配置中心框架IConfCenter

下一篇:【转】Java高并发,如何解决,什么方式解决