由于項目需求,需要將數據導出成Excel表格,并且可選擇導出項,可下載。項目使用的Spring+Mybatis+SpringMVC框架,利用Apache POI導出Excel。POI具體使用請自行百度。話不多說,上代碼。
ExportExcelUtil代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
package com.rixin.common.util; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.URLEncoder; import java.util.Collection; import java.util.Iterator; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Font; /** * 基于POI的javaee導出Excel工具類 * * @author [email protected] * @see POI */ public class ExportExcelUtil { /** * * @param response * 請求 * @param fileName * 文件名 如:"學生表" * @param excelHeader * excel表頭數組,存放"姓名#name"格式字符串,"姓名"為excel標題行, "name"為對象字段名 * @param dataList * 數據集合,需與表頭數組中的字段名一致,并且符合javabean規范 * @return 返回一個HSSFWorkbook * @throws Exception */ public static <T> HSSFWorkbook export(HttpServletResponse response, String fileName, String[] excelHeader, Collection<T> dataList) throws Exception { // 設置請求 response.setContentType( "application/application/vnd.ms-excel" ); response.setHeader( "Content-disposition" , "attachment;filename=" + URLEncoder.encode(fileName + ".xls" , "UTF-8" )); // 創建一個Workbook,對應一個Excel文件 HSSFWorkbook wb = new HSSFWorkbook(); // 設置標題樣式 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 = new String[excelHeader.length]; // 字段名數組 String[] fieldArray = new String[excelHeader.length]; for ( int i = 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 ( int i = 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(); int index = 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 ( int i = 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<? extends Object> tCls = t.getClass(); // 泛型為Object以及所有Object的子類 Method getMethod = tCls.getMethod(getMethodName, new Class[] {}); // 通過方法名得到對應的方法 Object value = getMethod.invoke(t, new Object[] {}); // 動態調用方,得到屬性值 if (value != null ) { dataCell.setCellValue(value.toString()); // 為當前列賦值 } } } OutputStream outputStream = response.getOutputStream(); // 打開流 wb.write(outputStream); // HSSFWorkbook寫入流 wb.close(); // HSSFWorkbook關閉 outputStream.flush(); // 刷新流 outputStream.close(); // 關閉流 return wb; } // 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代碼
1
2
3
4
5
6
7
8
9
10
|
@RequestMapping ( "/exportProject.do" ) public void 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> ... |
下面上圖
以上就是本文的全部內容,希望對大家的學習有所幫助。