1 /**
2 * 生成Excel工具类
3 * headers:表头
4 * dataset:javabean集合
5 * fileName:生成的Excel名称
6 * response:将excel表以字节流的形式返回给前端
7 * 这里使用的是poi工具类下的xssf,生成的excel要要以.xlsx结尾
8 * 如果使用hssf,生成的excel要以.xls结尾,且一个sheet里的数据最多只能有65535行
9 * @param <T>
10 */
11 @Component("exportExcel")
12 public class ExportExcelXSSFUtils<T> {
13 public void exportExcel(String[] headers, Collection<T> dataset, String fileName, HttpServletResponse response) {
14 // 声明一个工作薄
15 XSSFWorkbook workbook = new XSSFWorkbook();
16 // 生成一个表格
17 XSSFSheet sheet = workbook.createSheet(fileName);
18 //样式对象
19 XSSFCellStyle style=workbook.createCellStyle();
20 // 设置表格默认列宽度为15个字节
21 sheet.setDefaultColumnWidth(15);
22 // 产生表格标题行
23 XSSFRow row = sheet.createRow(0);
24 row.setHeightInPoints(30);//设置行高
25 for (int i = 0; i < headers.length; i++) {
26 XSSFCell cell=row.createCell(i);
27 //设置背景
28 style.setFillBackgroundColor((short)13);
29 // style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
30 //设置字体
31 XSSFFont font2 = workbook.createFont();
32 font2.setFontName("仿宋_GB2312");
33 // font2.setBoldweight(XSSFFont.);//粗体显示
34 font2.setFontHeightInPoints((short) 12); //字体大小
35 //font2.setColor(XSSFColor.toXSSFColor(c).index);//设置字体颜色
36 style.setFont(font2);//选择需要用到的字体格式
37 XSSFRichTextString text = new XSSFRichTextString(headers[i]);
38 cell.setCellStyle(style);
39 cell.setCellValue(text);
40 }
41 try {
42 // 遍历集合数据,产生数据行
43 Iterator<T> it = dataset.iterator();
44 int index = 0;
45 while (it.hasNext()) {
46 index++;
47 row = sheet.createRow(index);
48 T t = (T) it.next();
49 // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
50 Field[] fields = t.getClass().getDeclaredFields();
51 for (int i = 0; i < headers.length; i++) {
52 XSSFCell cell = row.createCell(i);
53 Field field = fields[i];
54 String fieldName = field.getName();
55 String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
56 Class tCls = t.getClass();
57 Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
58 Object value = getMethod.invoke(t, new Object[] {});
59 // 判断值的类型后进行强制类型转换
60 String textValue = null;
61 // 其它数据类型都当作字符串简单处理
62 if(value != null && value != ""){
63 textValue = value.toString();
64 }else{
65 textValue=String.valueOf(index);
66 }
67 if (textValue != null) {
68 XSSFRichTextString richString = new XSSFRichTextString(textValue);
69 cell.setCellValue(richString);
70 }
71 }
72 }
73 getExportedFile(workbook, fileName,response);
74 } catch (Exception e) {
75 e.printStackTrace();
76 }
77 }
78 /**
79 *
80 * 方法说明: 指定路径下生成EXCEL文件
81 * @return
82 */
83
84 public void getExportedFile(XSSFWorkbook workbook, String name, HttpServletResponse response) throws Exception {
85 System.out.println("name:"+name);
86 BufferedOutputStream fos = null;
87 try {
88 String fileName = name + ".xlsx";
89 response.setContentType("application/octet-stream");
90 response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"),"ISO8859-1"));
91 response.flushBuffer();
92 workbook.write(response.getOutputStream());
93 } catch (Exception e) {
94 e.printStackTrace();
95 } finally {
96 System.out.println("ok");
97 }
98 }
99 }