導入POI相關jar包,參考 http://zhuws.blog.51cto.com/11134439/1973698
其中有下載POI連接地址,和下載圖示.
2.步入正題,看代碼
// 大致思路,先看本地文件存在不,如果不存在,把查詢數據導出到Excel,然後再下載 代碼有點亂 String filePath = request.getParameter("filePath"); filePath = new String( filePath.getBytes("iso-8859-1"), "UTF-8"); File filetemp = null; byte[] fileContent = null; filetemp = new File(filePath); // 如果文件不存在 if(!filetemp.exists()){ String title = "序號,統一社會信用代碼或組織機構代碼,企業名稱,發證機關,獲獎內容,發證日期,有效日期"; String key = ",ZZJGDM,QYMC,FZJG,HJNR,KSRQ,JSRQ"; String[] titles = title.split(","); String[] keys = key.split(","); //-------------------POI保存數據到Excel----------------------// // 第一步,創建Excel 工作薄對象 HSSFWorkbook wb = new HSSFWorkbook(); // 第二步,創建Excel 工作表對象 HSSFSheet sheet = wb.createSheet("sheet1"); // 設置表格默認列寬度爲 30個 字節 sheet.setDefaultColumnWidth((short)15); // 設置樣式 HSSFCellStyle style = wb.createCellStyle(); style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); //合併單元格 HSSFRow rows = sheet.createRow(0); // 0,1,0,titles.length-1 表示合併 第1,2行 從左邊0列開始 到 titles.length-1 列結束 CellRangeAddress region = new CellRangeAddress(0,1,0,titles.length-1); sheet.addMergedRegion(region); rows.createCell((short) 0).setCellValue(fileName); // 創建 表格 標題欄 HSSFRow row = sheet.createRow(2); for(int i=0;i<titles.length;i++){ HSSFCell cell = row.createCell(i); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString(titles[i]); cell.setCellValue(text); } // 第五步, 假設 list是想要導出的數據 for(int i=0;i<list.size();i++){ HashMap map =(HashMap)list.get(i); // 轉換爲HashMap row = sheet.createRow(i+3); // 從第幾行開始寫入數據 for(int j = 0;j < keys.length;j++){ if(j==0){ row.createCell((short) 0).setCellValue(i+1); continue; } // 日期格式處理 ,對日期截取後 例如: 2017-11-08 if("KSRQ".equals(keys[j])||"JSRQ".equals(keys[j])){ String str = map.get(keys[j])==null?"":map.get(keys[j])+""; if(!"".equals(str)){ row.createCell((short) j).setCellValue(str.substring(0,10)); } }else if("XZXKFL".equals(keys[j])&&"51".equals(lx)){ row.createCell((short) j).setCellValue("食品相關產品"); }else{ row.createCell((short) j).setCellValue(map.get(keys[j])==null?"":map.get(keys[j])+""); } } } // 文件命名 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, 0); int year1 = calendar.get(Calendar.YEAR);// 月份 int month1 = calendar.get(Calendar.MONTH) + 1;// 日期 int date1 = calendar.get(Calendar.DATE); String d1 = year1 + "-" + month1 + "-" + date1;//2017-2-4 //拿到 事先定義好的靜態變量 就是 所謂的二級目錄 也是路徑的一部分 //拼接路徑 並且 創建文件夾 filePath = "D:\Zlxypt"; File dir = new File(filePath+year1+"/"+d1); //D:/Zlxypt/2017年/2017-2-4 if(!dir.exists()){ dir.mkdirs(); } String uuid = year1+UUID.randomUUID().toString(); String file_Name = year1+"/"+ d1 +"/" +uuid+".xls"; filePath += file_Name; //文件全路徑名稱 // 更新 title 發佈表 filePath titleServices.updaTitleById(tid, file_Name); // 第六步,將文件存到指定位置 try { FileOutputStream fout = new FileOutputStream(filePath); wb.write(fout); // 把數據寫入 excel中 fout.close(); wb.close(); } catch (Exception e) { e.printStackTrace(); } //-----------------下載 filePath= new String( filePath.getBytes("iso-8859-1"), "UTF-8"); filetemp = new File(filePath); fileContent = FileUtil.getBytes(filetemp); fileName += ".xls"; response.setHeader("Content-Disposition","attachment; filename=" + new String(fileName.getBytes("utf-8"), "iso-8859-1")); response.getOutputStream().write(fileContent,0,fileContent.length); response.getOutputStream().flush(); response.getOutputStream().close(); out.clear(); out = pageContext.pushBody();