Java Web利用POI導出Excel簡單例子


采用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次,最后只保留了樣式,而內容無法顯示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM