java實現Excel匯出
阿新 • • 發佈:2019-01-01
最近在做一個專案,其中有部分是關於匯出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; }
最終結果