Excel通用類工具(二)

迷戀著你微笑的人zz發表於2018-11-10

美女

前言

上一篇中寫到了用反射來處理類中的不用的屬性,但是Excel的列名還得手動輸入,這樣還是比較麻煩的,今天這篇就利用自定義註解來解決手動傳入列名的問題;其實很簡單的,只需要在上一篇的基礎上加一個類就可以了; 本篇所涉及的專案是在上一篇 Excel通用類工具(一) 的專案程式碼上進行的二次新增;

正文

  1. 新新增一個類 新新增一個註解類 ExcelName ,完整程式碼如下:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelName {
    String name() default "";
}

複製程式碼

這個類主要就是一個註解,對java的註解還不瞭解的可以點選這裡 傳送門,因為只需要知道每個屬性得列名,所以只定義了一個屬性name,該屬性的值就是列名;

  1. 改造實體類 pojoA 和 pojoB ,這一隻改造一個類: pojoA

public class PojoA {
    @ExcelName(name = "名稱")
    private String name;
    @ExcelName(name = "數量")
    private int num;
    @ExcelName(name = "價格")
    private double price;
    //省略set/get
}

複製程式碼

只需要在每個屬性上新增上邊的註解就可以了;

  1. 對核心程式碼進行改造 改造的程式碼不多,主要是將類中屬性上的註解的值讀取出來,放入列名中:

public class ExcelUtil<T> {
    public HSSFWorkbook setExcel(String title, List<T> tList) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, IOException {
        Field[] declaredFields = tList.get(0).getClass().getDeclaredFields();
//        1.建立Excel工作薄物件
        HSSFWorkbook workbook=new HSSFWorkbook();
//        2.建立Excel工作表物件
        HSSFSheet sheet=workbook.createSheet(title);
        HSSFRow row=null;
//        3.建立Excel工作表的第一行,並填充列名
        row=sheet.createRow(0);
        for (int i=0;i<declaredFields.length;i++){
            ExcelName excelName = declaredFields[i].getAnnotation(ExcelName.class);
            if(excelName!=null){
                if(excelName.name()!=null){
                    row.createCell(i).setCellValue(excelName.name());
                }
            }else {
                row.createCell(i).setCellValue("");
            }
        }
       /* for(int i=0;i<columnNames.length;i++){
            row.createCell(i).setCellValue(columnNames[i]);
        }*/
//        4.將資料填充至表格中
        for(int j=1;j<=tList.size();j++){
            T t= tList.get(j-1);
            row=sheet.createRow(j);
            for(int i=0;i<declaredFields.length;i++){
                // 通過反射獲取屬性值
                String fieldName = declaredFields[i].getName();
                String getMethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
                Method declaredMethod = t.getClass().getDeclaredMethod(getMethodName);
                //執行方法
                Object fieldValue = declaredMethod.invoke(t);
                //判斷是否為空
                if(fieldValue!=null &&  !"".equals(fieldValue)){
                    //判斷屬性值型別
                    if(fieldValue instanceof Integer){
                        row.createCell(i).setCellValue(Integer.valueOf(fieldValue.toString()));
                    }else if(fieldValue instanceof Double){
                        row.createCell(i).setCellValue(Double.valueOf(fieldValue.toString()));
                    }else if(fieldValue instanceof Date){
                        row.createCell(i).setCellValue(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(fieldValue));
                    }else {
                       row.createCell(i).setCellValue(fieldValue.toString());
                    }
                }else {
                    row.createCell(i).setCellValue("");
                }
            }
        }
//       5 .自動設定列寬
        for (int i = 0; i < declaredFields.length; i++) {
            sheet.autoSizeColumn(i);
            sheet.setColumnWidth(i,sheet.getColumnWidth(i)*17/10);
        }
        return workbook;
    }
}

複製程式碼

較上一篇筆記來說,主要新增的就是第三部的那一部分程式碼,而原來那部分就是註釋了的那一部分,可以看一下有什麼區別;還有就是最後新增了第五步的那一部分程式碼,需要提醒的是這部分程式碼需要在資料填充完了之後再呼叫;

  1. 測試類 測試還是用上一篇的測試類,這裡就不貼出來了;

總結

這篇筆記主要是在上一篇的基礎上新增了自定義註解,對註解的瞭解也進一步加深,但還是有許多的不足之處;

相關文章