采用Spring mvc架構:
Controller層代碼如下
1 @Controller 2 public class StudentExportController{ 3 4 @Autowired 5 private StudentExportService studentExportService; 6 7 @RequestMapping(value = "/excel/export") 8 public void exportExcel(HttpServletRequest request, HttpServletResponse response) 9 throws Exception { 10 11 List<Student> list = new ArrayList<Student>(); 12 list.add(new Student(1000,"zhangsan","20")); 13 list.add(new Student(1001,"lisi","23")); 14 list.add(new Student(1002,"wangwu","25")); 15 HSSFWorkbook wb = studentExportService.export(list); 16 response.setContentType("application/vnd.ms-excel"); 17 response.setHeader("Content-disposition", "attachment;filename=student.xls"); 18 OutputStream ouputStream = response.getOutputStream(); 19 wb.write(ouputStream); 20 ouputStream.flush(); 21 ouputStream.close(); 22 } 23 }
Service層代碼如下:
1 @Service 2 public class StudentExportService { 3 4 String[] excelHeader = { "Sno", "Name", "Age"}; 5 public HSSFWorkbook export(List<Campaign> list) { 6 HSSFWorkbook wb = new HSSFWorkbook(); 7 HSSFSheet sheet = wb.createSheet("Campaign"); 8 HSSFRow row = sheet.createRow((int) 0); 9 HSSFCellStyle style = wb.createCellStyle(); 10 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 11 12 for (int i = 0; i < excelHeader.length; i++) { 13 HSSFCell cell = row.createCell(i); 14 cell.setCellValue(excelHeader[i]); 15 cell.setCellStyle(style); 16 sheet.autoSizeColumn(i); 17 } 18 19 for (int i = 0; i < list.size(); i++) { 20 row = sheet.createRow(i + 1); 21 Student student = list.get(i); 22 row.createCell(0).setCellValue(student.getSno()); 23 row.createCell(1).setCellValue(student.getName()); 24 row.createCell(2).setCellValue(student.getAge()); 25 } 26 return wb; 27 } 28 }
前台的js代碼如下:
1 <script> 2 function exportExcel(){ 3 location.href="excel/export"; 4 <!--這里不能用ajax請求,ajax請求無法彈出下載保存對話框--> 5 } 6 </script>
設置Excel樣式以及注意點:
1 String[] excelHeader = { "所屬區域(地市)", "機房", "機架資源情況", "", "", "", "", 2 "", "端口資源情況", "", "", "", "", "", "機位資源情況", "", "", "設備資源情況", 3 "", "", "IP資源情況", "", "", "", "", "網絡設備數" }; 4 String[] excelHeader1 = { "", "", "總量(個)", "空閑(個)", "預占(個)", "實占(個)", 5 "自用(個)", "其它(個)", "總量(個) ", "在用(個)", "空閑(個)", "總帶寬(M)", 6 "在用帶寬(M)", "空閑帶寬(M)", "總量(個)", "在用(個)", "空閑(個)", "設備總量(個)", 7 "客戶設備(個)", "電信設備(個)", "總量(個)", "空閑(個)", "預占用(個)", "實占用(個)", 8 "自用(個)", "" }; 9 // 單元格列寬 10 int[] excelHeaderWidth = { 150, 120, 100, 100, 100, 100, 100, 100, 100, 11 100, 100, 120, 120, 120, 120, 120, 120, 150, 150, 150, 120, 12 120, 150, 150, 120, 150 }; 13 14 HSSFWorkbook wb = new HSSFWorkbook(); 15 HSSFSheet sheet = wb.createSheet("機房報表統計"); 16 HSSFRow row = sheet.createRow((int) 0); 17 HSSFCellStyle style = wb.createCellStyle(); 18 // 設置居中樣式 19 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中 20 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直居中 21 22 // 設置合計樣式 23 HSSFCellStyle style1 = wb.createCellStyle(); 24 Font font = wb.createFont(); 25 font.setColor(HSSFColor.RED.index); 26 font.setBoldweight(Font.BOLDWEIGHT_BOLD); // 粗體 27 style1.setFont(font); 28 style1.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中 29 style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直居中 30 31 // 合並單元格 32 // first row (0-based) last row (0-based) first column (0-based) last 33 // column (0-based) 34 sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0)); 35 sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1)); 36 sheet.addMergedRegion(new CellRangeAddress(0, 0, 2, 7)); 37 sheet.addMergedRegion(new CellRangeAddress(0, 0, 8, 13)); 38 sheet.addMergedRegion(new CellRangeAddress(0, 0, 14, 16)); 39 sheet.addMergedRegion(new CellRangeAddress(0, 0, 17, 19)); 40 sheet.addMergedRegion(new CellRangeAddress(0, 0, 20, 24)); 41 sheet.addMergedRegion(new CellRangeAddress(0, 1, 25, 25)); 42 // 設置列寬度(像素) 43 for (int i = 0; i < excelHeaderWidth.length; i++) { 44 sheet.setColumnWidth(i, 32 * excelHeaderWidth[i]); 45 } 46 47 // 添加表格頭 48 for (int i = 0; i < excelHeader.length; i++) { 49 HSSFCell cell = row.createCell(i); 50 cell.setCellValue(excelHeader[i]); 51 cell.setCellStyle(style); 52 } 53 row = sheet.createRow((int) 1); 54 for (int i = 0; i < excelHeader1.length; i++) { 55 HSSFCell cell = row.createCell(i); 56 cell.setCellValue(excelHeader1[i]); 57 cell.setCellStyle(style); 58 }
注意點1:合並單元格 new CellRangeAddress(int,int,int,int)
first row (0-based) ,last row (0-based), first column (0-based),last column (0-based)
注意點2:合並單元格
String[] excelHeader = { "所屬區域(地市)", "機房", "機架資源情況", "", "", "", "","", "端口資源情況", "", "", "", "", "", "機位資源情況", "", "", "設備資源情況","", "", "IP資源情況", "", "", "", "", "網絡設備數" };
合並以后的單元格雖然是一個,但是仍然要保留其單元格內容,此處用空字符串代替,否則后續表頭顯示不出
注意點3:填充單元格
正確寫法:
HSSFCell cell = row.createCell(i);
cell.setCellValue(excelHeader1[i]);
cell.setCellStyle(style);
錯誤寫法:
row.createCell(i).setCellValue(excelHeader1[i]);
row.createCell(i).setCellStyle(style);
本人為了省一個HSSFCell對象,使用了錯誤寫法,導致HSSFCell對象創建了2次,最后只保留了樣式,而內容無法顯示