1. 程式人生 > >java實現Excel匯出

java實現Excel匯出

最近在做一個專案,其中有部分是關於匯出Excel,之前去的公司匯出Excel都是已經封裝好了的,現在從頭開始寫。用的是比較常用的POI,廢話不多說。

用的框架是SSH,poi的版本是3.17,poi-3.17.jar

功能介紹:匯出查詢結果的報表,如下圖為資料庫隨便填的資料,在頁面上做查詢,從頁面上匯出Excel


前端:

<a href="../export.do" class="easyui-linkbutton">匯出</a>

後臺:

//匯出Excel
    @RequestMapping("export")
    @ResponseBody
    public String createExcel(HttpServletResponse response) throws IOException {
    	//獲取查詢結果的資料,reportlist為別的方法查詢出來的資料,格式為List<Object[]>,其實這裡不管reportlist是什麼資料格式,這裡只要對其進行封裝就行了
    	List<Object[]> newlist = reportlist;
    	//資料封裝,這裡的map之所以敢這樣add是因為這裡的add順序和hql中的select欄位順序是一樣的,總共就查詢那麼多欄位
		List<Map<String,Object>> solist = new ArrayList();
		for(Object[] obj:newlist){
			//每次迴圈都要重新new一個map,表示不同物件
			Map<String,Object> map = new HashMap();
				map.put("hospitalid", obj[0]);
				map.put("idnumber",obj[1]);
				map.put("name",obj[2]);
				map.put("sex",obj[3]);
				map.put("totalfee",obj[4]);
				map.put("basic",obj[5]);
				map.put("supplement",obj[6]);
				map.put("otherfee",obj[7]);
				map.put("othertotal",obj[8]);
				map.put("selftotal",obj[9]);
				solist.add(map);
		}
        //建立HSSFWorkbook物件(excel的文件物件)
        HSSFWorkbook wb = new HSSFWorkbook();
        //建立新的sheet物件(excel的表單)
        HSSFSheet sheet=wb.createSheet("報表");
        //在sheet裡建立第一行,引數為行索引(excel的行),可以是0~65535之間的任何一個
        HSSFRow row1=sheet.createRow(0);
        //建立單元格(excel的單元格,引數為列索引,可以是0~255之間的任何一個
        HSSFCell cell=row1.createCell(0);
        
        // 1.生成字型物件  
        HSSFFont font = wb.createFont();  
        font.setFontHeightInPoints((short) 12);  
        font.setFontName("新宋體");  
        
        // 2.生成樣式物件,這裡的設定居中樣式和版本有關,我用的poi用HSSFCellStyle.ALIGN_CENTER會報錯,所以用下面的
        HSSFCellStyle style = wb.createCellStyle();
//      style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//設定居中樣式
        style.setFont(font); // 呼叫字型樣式物件  
        style.setWrapText(true);  
        style.setAlignment(HorizontalAlignment.CENTER);//設定居中樣式
        
        // 3.單元格應用樣式  
        cell.setCellStyle(style); 
        
        //設定單元格內容
        cell.setCellValue("報表");
        //合併單元格CellRangeAddress構造引數依次表示起始行,截至行,起始列, 截至列
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,9));
       
        //在sheet裡建立第二行
        HSSFRow row2=sheet.createRow(1);
        //建立單元格並設定單元格內容及樣式
        HSSFCell cell0=row2.createCell(0);
        cell0.setCellStyle(style);
        cell0.setCellValue("住院號");
        
        HSSFCell cell1=row2.createCell(1);
        cell1.setCellStyle(style);
        cell1.setCellValue("身份證號");
        
        HSSFCell cell2=row2.createCell(2);
        cell2.setCellStyle(style);
        cell2.setCellValue("姓名");
        
        HSSFCell cell3=row2.createCell(3);
        cell3.setCellStyle(style);
        cell3.setCellValue("性別");
        
        HSSFCell cell4=row2.createCell(4);
        cell4.setCellStyle(style);
        cell4.setCellValue("總金額");
        
        HSSFCell cell5=row2.createCell(5);
        cell5.setCellStyle(style);
        cell5.setCellValue("基本醫療保險賠付金額");
        
        HSSFCell cell6=row2.createCell(6);
        cell6.setCellStyle(style);
        cell6.setCellValue("補充醫療賠付金額");
        
        HSSFCell cell7=row2.createCell(7);
        cell7.setCellStyle(style);
        cell7.setCellValue("其他賠付金額");
        
        HSSFCell cell8=row2.createCell(8);
        cell8.setCellStyle(style);
        cell8.setCellValue("總賠付金額");
        
        HSSFCell cell9=row2.createCell(9);
        cell9.setCellStyle(style);
        cell9.setCellValue("總自費金額");
        //單元格寬度自適應
        sheet.autoSizeColumn((short)3);
        sheet.autoSizeColumn((short)4);
        sheet.autoSizeColumn((short)5);
        sheet.autoSizeColumn((short)6);
        sheet.autoSizeColumn((short)7);
        sheet.autoSizeColumn((short)8);
        sheet.autoSizeColumn((short)9);
        //寬度自適應可自行選擇自適應哪一行,這裡寫在前面的是適應第二行,寫在後面的是適應第三行
        for (int i = 0; i < solist.size(); i++) {
            //單元格寬度自適應
        	sheet.autoSizeColumn((short)0);
        	sheet.autoSizeColumn((short)1);
        	sheet.autoSizeColumn((short)2);
        	//從sheet第三行開始填充資料
        	HSSFRow rowx=sheet.createRow(i+2);
        	Map<String,Object> map = solist.get(i);
       //這裡的hospitalid,idnumber等都是前面定義的全域性變數
        	hospitalid = (String) map.get("hospitalid");
        	HSSFCell cell00=rowx.createCell(0);
        	cell00.setCellStyle(style);
        	cell00.setCellValue(hospitalid);
        	
        	idnumber = (String) map.get("idnumber");
        	HSSFCell cell01=rowx.createCell(1);
        	cell01.setCellStyle(style);
        	cell01.setCellValue(idnumber);
        	
        	name = (String) map.get("name");
        	HSSFCell cell02=rowx.createCell(2);
        	cell02.setCellStyle(style);
        	cell02.setCellValue(name);
        	
        	sex = (String) map.get("sex");
        	HSSFCell cell03=rowx.createCell(3);
        	cell03.setCellStyle(style);
        	cell03.setCellValue(sex);
        	
        	totalfee = (String) map.get("totalfee");
        	HSSFCell cell04=rowx.createCell(4);
        	cell04.setCellStyle(style);
        	cell04.setCellValue(totalfee);
        	
        	basic = (double) map.get("basic");
        	HSSFCell cell05=rowx.createCell(5);
        	cell05.setCellStyle(style);
        	cell05.setCellValue(basic);
        	
        	supplement = (double) map.get("supplement");
        	HSSFCell cell06=rowx.createCell(6);
        	cell06.setCellStyle(style);
        	cell06.setCellValue(supplement);
        	
        	otherfee = (double) map.get("otherfee");
        	HSSFCell cell07=rowx.createCell(7);
        	cell07.setCellStyle(style);
        	cell07.setCellValue(otherfee);
        	
        	othertotal = (double) map.get("othertotal");
        	HSSFCell cell08=rowx.createCell(8);
        	cell08.setCellStyle(style);
        	cell08.setCellValue(othertotal);
        	
        	selftotal = (double) map.get("selftotal");
        	HSSFCell cell09=rowx.createCell(9);
        	cell09.setCellStyle(style);
        	cell09.setCellValue(selftotal);
        }
        //輸出Excel檔案
        OutputStream output=response.getOutputStream();
        response.reset();
        response.setHeader("Content-disposition", "attachment; filename=report.xls");//檔名這裡可以改
        response.setContentType("application/msexcel");
        wb.write(output);
        output.close();
        return null;
    }

最終結果