Spring+Mybatis+SpringMVC框架,利用Apache POI動態匯出Excel
阿新 • • 發佈:2019-01-02
Spring+Mybatis+SpringMVC框架,利用Apache POI匯出Excel。POI具體使用請自行百度。話不多說,上程式碼。
ExportExcelUtil程式碼
packagecom.rixin.common.util; importjava.io.OutputStream; importjava.lang.reflect.Method; importjava.net.URLEncoder; importjava.util.Collection; importjava.util.Iterator; importjavax.servlet.http.HttpServletResponse; importorg.apache.poi.hssf.usermodel.HSSFCell; importorg.apache.poi.hssf.usermodel.HSSFCellStyle; importorg.apache.poi.hssf.usermodel.HSSFRow; importorg.apache.poi.hssf.usermodel.HSSFSheet; importorg.apache.poi.hssf.usermodel.HSSFWorkbook; importorg.apache.poi.ss.usermodel.Font; /** * 基於POI的javaee匯出Excel工具類 * @author wuqingcong * @see POI */ publicclass ExportExcelUtil { /** * * @param response * 請求 * @param fileName * 檔名 如:"學生表" * @param excelHeader * excel表頭陣列,存放"姓名#name"格式字串,"姓名"為excel標題行, "name"為物件欄位名 * @param dataList * 資料集合,需與表頭陣列中的欄位名一致,並且符合javabean規範 * @return 返回一個HSSFWorkbook * @throws Exception */ publicstatic <T> HSSFWorkbook export(HttpServletResponse response, String fileName, String[] excelHeader, Collection<T> dataList) throwsException { // 設定請求 response.setContentType("application/application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName + ".xls","UTF-8")); // 建立一個Workbook,對應一個Excel檔案 HSSFWorkbook wb = newHSSFWorkbook(); // 設定標題樣式 HSSFCellStyle titleStyle = wb.createCellStyle(); // 設定單元格邊框樣式 titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上邊框 細邊線 titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下邊框 細邊線 titleStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左邊框 細邊線 titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右邊框 細邊線 // 設定單元格對齊方式 titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中 titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中 // 設定字型樣式 Font titleFont = wb.createFont(); titleFont.setFontHeightInPoints((short)15);// 字型高度 titleFont.setFontName("黑體");// 字型樣式 titleStyle.setFont(titleFont); // 在Workbook中新增一個sheet,對應Excel檔案中的sheet HSSFSheet sheet = wb.createSheet(fileName); // 標題陣列 String[] titleArray = newString[excelHeader.length]; // 欄位名陣列 String[] fieldArray = newString[excelHeader.length]; for(inti = 0; i < excelHeader.length; i++) { String[] tempArray = excelHeader[i].split("#");// 臨時陣列 分割# titleArray[i] = tempArray[0]; fieldArray[i] = tempArray[1]; } // 在sheet中新增標題行 HSSFRow row = sheet.createRow((int)0);// 行數從0開始 HSSFCell sequenceCell = row.createCell(0);// cell列 從0開始 第一列新增序號 sequenceCell.setCellValue("序號"); sequenceCell.setCellStyle(titleStyle); sheet.autoSizeColumn(0);// 自動設定寬度 // 為標題行賦值 for(inti = 0; i < titleArray.length; i++) { HSSFCell titleCell = row.createCell(i + 1);// 0號位被序號佔用,所以需+1 titleCell.setCellValue(titleArray[i]); titleCell.setCellStyle(titleStyle); sheet.autoSizeColumn(i + 1);// 0號位被序號佔用,所以需+1 } // 資料樣式 因為標題和資料樣式不同 需要分開設定 不然會覆蓋 HSSFCellStyle dataStyle = wb.createCellStyle(); // 設定資料邊框 dataStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); dataStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); dataStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); dataStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); // 設定居中樣式 dataStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中 dataStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中 // 設定資料字型 Font dataFont = wb.createFont(); dataFont.setFontHeightInPoints((short)12);// 字型高度 dataFont.setFontName("宋體");// 字型 dataStyle.setFont(dataFont); // 遍歷集合資料,產生資料行 Iterator<T> it = dataList.iterator(); intindex =0; while(it.hasNext()) { index++;// 0號位被佔用 所以+1 row = sheet.createRow(index); // 為序號賦值 HSSFCell sequenceCellValue = row.createCell(0);// 序號值永遠是第0列 sequenceCellValue.setCellValue(index); sequenceCellValue.setCellStyle(dataStyle); sheet.autoSizeColumn(0); T t = (T) it.next(); // 利用反射,根據傳過來的欄位名陣列,動態呼叫對應的getXxx()方法得到屬性值 for(inti = 0; i < fieldArray.length; i++) { HSSFCell dataCell = row.createCell(i + 1); dataCell.setCellStyle(dataStyle); sheet.autoSizeColumn(i + 1); String fieldName = fieldArray[i]; String getMethodName = "get"+ fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);// 取得對應getXxx()方法 Class<?extendsObject> tCls = t.getClass();// 泛型為Object以及所有Object的子類 Method getMethod = tCls.getMethod(getMethodName, newClass[] {});// 通過方法名得到對應的方法 Object value = getMethod.invoke(t, newObject[] {});// 動態呼叫方,得到屬性值 if(value != null) { dataCell.setCellValue(value.toString());// 為當前列賦值 } } } OutputStream outputStream = response.getOutputStream();// 開啟流 wb.write(outputStream);// HSSFWorkbook寫入流 wb.close();// HSSFWorkbook關閉 outputStream.flush();// 重新整理流 outputStream.close();// 關閉流 returnwb; } // XSSFCellStyle.ALIGN_CENTER 居中對齊 // XSSFCellStyle.ALIGN_LEFT 左對齊 // XSSFCellStyle.ALIGN_RIGHT 右對齊 // XSSFCellStyle.VERTICAL_TOP 上對齊 // XSSFCellStyle.VERTICAL_CENTER 中對齊 // XSSFCellStyle.VERTICAL_BOTTOM 下對齊 // CellStyle.BORDER_DOUBLE 雙邊線 // CellStyle.BORDER_THIN 細邊線 // CellStyle.BORDER_MEDIUM 中等邊線 // CellStyle.BORDER_DASHED 虛線邊線 // CellStyle.BORDER_HAIR 小圓點虛線邊線 // CellStyle.BORDER_THICK 粗邊線 }
controller程式碼
@RequestMapping("/exportProject.do") publicvoid exportProject(HttpServletResponse response, String export) { String[] excelHeader = export.split(","); List<Project> projectList = projectService.getProjects(null); try{ ExportExcelUtil.export(response,"專案表", excelHeader, projectList); }catch(Exception e) { e.printStackTrace(); } }
JSP部分程式碼
1 2 3 4 5 6 7 |
...
<div
style= "margin-top:
5px;"
class = "am-input-group
am-u-sm-4" >
<span class = "am-input-group-label" ><input
type= "checkbox"
value= "專案名稱#name" name= "export" checked= "checked" ></span>
<input
type= "text" value= "專案名稱" disabled= "disabled" >
</div>
...
|
下面上圖