1. 程式人生 > >POI萬能匯出模板

POI萬能匯出模板

一.問題

最近做公司的考勤報工系統,開發多張考勤報表,每一張報表都有匯出Excel需求。

由於每一張報表匯出Excel的欄位都不同,每一個張報表都寫了一個匯出方法,工作量大。

所以想能不能抽取出一個匯出的公共方法。

二.解決問題

通過Java的反射機制,取出物件中的對應欄位,設定到POI的Cell物件中,匯出Excel。

公共方法:

     /**
     * POI匯出公共方法
     * @param obj
     * @param className
     * @param fileName
     * @param excelHeaders
     * @param fields
     * @param response
     * @throws Exception
     */
    public static void publicExport(Object obj, Class className, String fileName, String[] excelHeaders,String[] fields, HttpServletResponse response) throws Exception {
        //匯出資料為空,直接返回
        List query = (List)obj;
        if (query.size() == 0) {
            return;
        }
        //獲取匯出資料的總條數
        int countColumnNum = query.size();
        //建立XSSFWorkbook檔案物件
        XSSFWorkbook book = null;
        //管理員匯出資料
        book = new XSSFWorkbook();
        //建立一個Name的新表
        XSSFSheet sheet = book.createSheet(fileName);
        // 獲取表的第一行
        XSSFRow firstRow = sheet.createRow(0);
        //建立表的第一行的每列的說明
        XSSFCell[] firstCells = new XSSFCell[excelHeaders.length];
        //給表的第一行的每一列賦值
        for (int j = 0; j < excelHeaders.length; j++) {
            firstCells[j] = firstRow.createCell(j);
            firstCells[j].setCellValue(new XSSFRichTextString(excelHeaders[j]));
        }
        //反射從物件中取出方法物件
        List<Method> methodList = new ArrayList<>();
        for(String method : fields){
            methodList.add(className.getMethod("get"+firstUpper(method)));
        }
        //把表的第一列寫好後,接下來從表的第二列開始把對應的值寫入到檔案裡
        for (int i = 0; i < countColumnNum; i++) {
            //給execl建立一行
            XSSFRow row = sheet.createRow(i + 1);
            //取出資料
            Object object = query.get(i);
            //迴圈給列賦值
            for (int column = 0; column < excelHeaders.length; column++) {
                //確認每一列對應的表的列
                for(int method = 0;method<methodList.size(); method++){
                    XSSFCell cell = row.createCell(method);
                    cell.setCellValue(methodList.get(method).invoke(object)==null?"":methodList.get(method).invoke(object).toString());
                }
            }
        }
        //寫一個try catch捕捉異常(response獲取輸出流)
        OutputStream os = null;
        try {
	    //防止匯出的Excel檔名中文亂碼
            String filename= new String(fileName.getBytes("utf-8"), "ISO_8859_1");
            response.setHeader("Content-Disposition", "attachment;filename="+filename+".xlsx");
            response.setContentType("application");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            os = response.getOutputStream();
            book.write(os);
        } catch (IOException e) {
            System.out.println("IO流異常");
        } finally {
            try {
                os.close();
            } catch (IOException e) {
                System.out.println("關閉IO流異常");
            }
        }
    }

    /**
      *將字串的第一個字母轉換成大寫
      *
      */
    public static String firstUpper(String string) {
        char[] charArray = string.toCharArray();
        charArray[0] -= 32;
        return String.valueOf(charArray);
    }

引數說明:

obj:需要匯出的資料集合  
className:需要匯出集合的物件Class  
fileName: 匯出Excel檔名  
excelHeaders:匯出Excel內容頭資訊  
fields:需要匯出的對應欄位