1. 程式人生 > >Java Web利用POI匯出Excel簡單例子

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

採用Spring mvc架構: 

Controller層程式碼如下 

@Controller  
public class StudentExportController{  
  
    @Autowired  
    private StudentExportService studentExportService;  
  
    @RequestMapping(value = "/excel/export")  
    public void exportExcel(HttpServletRequest request, HttpServletResponse response)   
    throws Exception {  
          
        List<Student> list = new ArrayList<Student>();  
        list.add(new Student(1000,"zhangsan","20"));  
        list.add(new Student(1001,"lisi","23"));  
        list.add(new Student(1002,"wangwu","25"));  
        HSSFWorkbook wb = studentExportService.export(list);  
        response.setContentType("application/vnd.ms-excel");  
        response.setHeader("Content-disposition", "attachment;filename=student.xls");  
        OutputStream ouputStream = response.getOutputStream();  
        wb.write(ouputStream);  
        ouputStream.flush();  
        ouputStream.close();  
   }  
}  

Service層程式碼如下: 

@Service  
public class StudentExportService {  
  
    String[] excelHeader = { "Sno", "Name", "Age"};  
    public HSSFWorkbook export(List<Campaign> list) {  
        HSSFWorkbook wb = new HSSFWorkbook();  
        HSSFSheet sheet = wb.createSheet("Campaign");  
        HSSFRow row = sheet.createRow((int) 0);  
        HSSFCellStyle style = wb.createCellStyle();  
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
  
        for (int i = 0; i < excelHeader.length; i++) {  
            HSSFCell cell = row.createCell(i);  
            cell.setCellValue(excelHeader[i]);  
            cell.setCellStyle(style);  
            sheet.autoSizeColumn(i);  
        }  
  
        for (int i = 0; i < list.size(); i++) {  
            row = sheet.createRow(i + 1);  
            Student student = list.get(i);  
            row.createCell(0).setCellValue(student.getSno());  
            row.createCell(1).setCellValue(student.getName());  
            row.createCell(2).setCellValue(student.getAge());  
        }  
        return wb;  
    }  
}  

前臺的js程式碼如下: 


<script>  
function exportExcel(){  
     location.href="excel/export";  
     <!--這裡不能用ajax請求,ajax請求無法彈出下載儲存對話方塊-->  
 }  
</script>  

設定Excel樣式以及注意點:

	String[] excelHeader = { "所屬區域(地市)", "機房", "機架資源情況", "", "", "", "",
		"", "埠資源情況", "", "", "", "", "", "機位資源情況", "", "", "裝置資源情況",
		"", "", "IP資源情況", "", "", "", "", "網路裝置數" };
	String[] excelHeader1 = { "", "", "總量(個)", "空閒(個)", "預佔(個)", "實佔(個)",
		"自用(個)", "其它(個)", "總量(個) ", "在用(個)", "空閒(個)", "總頻寬(M)",
		"在用頻寬(M)", "空閒頻寬(M)", "總量(個)", "在用(個)", "空閒(個)", "裝置總量(個)",
		"客戶裝置(個)", "電信裝置(個)", "總量(個)", "空閒(個)", "預佔用(個)", "實佔用(個)",
		"自用(個)", "" };
	// 單元格列寬
	int[] excelHeaderWidth = { 150, 120, 100, 100, 100, 100, 100, 100, 100,
		100, 100, 120, 120, 120, 120, 120, 120, 150, 150, 150, 120,
		120, 150, 150, 120, 150 };
 
	HSSFWorkbook wb = new HSSFWorkbook();
	HSSFSheet sheet = wb.createSheet("機房報表統計");
	HSSFRow row = sheet.createRow((int) 0);
	HSSFCellStyle style = wb.createCellStyle();
	// 設定居中樣式
	style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中
	style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直居中
 
	// 設定合計樣式
	HSSFCellStyle style1 = wb.createCellStyle();
	Font font = wb.createFont();
	font.setColor(HSSFColor.RED.index);
	font.setBoldweight(Font.BOLDWEIGHT_BOLD); // 粗體
	style1.setFont(font);
	style1.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中
	style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直居中
 
	// 合併單元格
	// first row (0-based) last row (0-based) first column (0-based) last
	// column (0-based)
	sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
	sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1));
	sheet.addMergedRegion(new CellRangeAddress(0, 0, 2, 7));
	sheet.addMergedRegion(new CellRangeAddress(0, 0, 8, 13));
	sheet.addMergedRegion(new CellRangeAddress(0, 0, 14, 16));
	sheet.addMergedRegion(new CellRangeAddress(0, 0, 17, 19));
	sheet.addMergedRegion(new CellRangeAddress(0, 0, 20, 24));
	sheet.addMergedRegion(new CellRangeAddress(0, 1, 25, 25));
	// 設定列寬度(畫素)
	for (int i = 0; i < excelHeaderWidth.length; i++) {
	    sheet.setColumnWidth(i, 32 * excelHeaderWidth[i]);
	}
 
	// 新增表格頭
	for (int i = 0; i < excelHeader.length; i++) {
	    HSSFCell cell = row.createCell(i);
	    cell.setCellValue(excelHeader[i]);
	    cell.setCellStyle(style);
	}
	row = sheet.createRow((int) 1);
	for (int i = 0; i < excelHeader1.length; i++) {
	    HSSFCell cell = row.createCell(i);
	    cell.setCellValue(excelHeader1[i]);
	    cell.setCellStyle(style);
	}

注意點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次,最後只保留了樣式,而內容無法顯示