1、定義註解,用於vo類中標記使用到的屬性java
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";
}
2、反射工具類
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; } }}