標籤:描述 mave download work throw scom 後端 off osi
本功能描述,在前端頁面點擊下載按鈕,開始下載所需資料,如下:
Google瀏覽器效果如下:
開啟Excel如下:
Firefox瀏覽器效果如下:
首先要匯入POI的jar包,我的工程採用maven管理,所以添加比較簡單,如下代碼
找到項目的pom.xml檔案在<dependencies>中加入
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.11</version></dependency>
如果需要手動匯入可以去官網自己下載:https://poi.apache.org/
然後就可以開始寫代碼了,我先寫的後端代碼,本地環境測試:
//列出部分引用import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFCellStyle;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.hssf.util.CellRangeAddress;String timeStamp= new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //建立工作表,sheet對象,行以及儲存格。 HSSFWorkbook wb=new HSSFWorkbook(); HSSFSheet sheet=wb.createSheet("History"); HSSFRow row=sheet.createRow(0); //字型置中 HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); HSSFCell cell=row.createCell(0); cell.setCellStyle(style); cell.setCellValue("validatorHistory"+timeStamp); sheet.addMergedRegion(new CellRangeAddress(0,0,0,5));//合併儲存格參數為起始行,截至行,起始列, 截至列 //在sheet中建立第二行 HSSFRow row2=sheet.createRow(1); //建立儲存格並設定儲存格內容 row2.createCell(0).setCellValue("Name1"); row2.createCell(1).setCellValue("Name2"); row2.createCell(2).setCellValue("Time1"); row2.createCell(3).setCellValue("Time2"); row2.createCell(4).setCellValue("person1"); row2.createCell(5).setCellValue("iscomplete"); // 調整列寬 sheet.setColumnWidth(0, (short)5500); sheet.setColumnWidth(1, (short)5500); sheet.setColumnWidth(2, (short)5500); sheet.setColumnWidth(3, (short)5500); sheet.setColumnWidth(4, (short)6000); sheet.setColumnWidth(5, (short)4000); //取出資料庫中的值放入表格中 int rowNum = 2; List<類> history=*****Repository.get*****;//從資料庫取出資料 if(history!=null && history.size()>0){ for(ValidatorTrigger vt:history){ HSSFRow vtrow=sheet.createRow(rowNum); vtrow.createCell(0).setCellValue(vt.getName1()); vtrow.createCell(1).setCellValue(vt.getName2()); vtrow.createCell(2).setCellValue(vt.getTime1()); vtrow.createCell(3).setCellValue(vt.getTime2()); vtrow.createCell(4).setCellValue(vt.getPerson1()); vtrow.createCell(5).setCellValue(vt.isComplete()); rowNum++; } } //輸出Excel檔案 FileOutputStream output=new FileOutputStream("d:\\workbook.xls"); wb.write(out); out.flush();
運行後就可以在D盤下看到workbook.xls檔案了
測試POI可用,開始整體寫,首先是前端代碼,前端使用的是bootstrap:
//只貼了相關代碼<div class="down col-xs-6 col-md-offset-3"> <a id="download" href="#" class="btn btn-info btn-sm"> <span class="glyphicon glyphicon-download-alt"></span>DownloadHistory</a></div>$(‘#download‘).click(function(){ var name1=$("select[id=name1]").val(); var name2=$("select[id=name2]").val(); location.href="/history/download?name1="+name1+"&name2="+name2; });
這裡有個比較坑的地方,我之前使用的ajax方式,無論我怎樣debug後台都沒有下載的影子,後來我終於對我的前端產生了懷疑,網上查了一下,發現ajax請求只是個“字元型”的請求,即請求的內容是以文本類型存放的。這個link:71520390 所以這裡採用location.href方式(特意選了帶參數的)
然後是controller部分:接收參數,調用Service
@ResponseBody @RequestMapping(value = "/history/download", method = RequestMethod.GET) public void download(HttpServletRequest request, HttpServletResponse response) throws IOException{ String name1=request.getParameter("name1"); String name2=request.getParameter("name2"); request.setCharacterEncoding("UTF-8"); //防止字型亂碼 response.setCharacterEncoding("UTF-8"); this.***Service.downloadHistory(name1,name2,request,response); }
Service代碼如下:
public void downloadHistory(String name1, String name2,HttpServletRequest request, HttpServletResponse response) throws IOException{ OutputStream out = null; String timeStamp= new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //建立工作表,sheet對象,行以及儲存格。 //在sheet中建立第二行 //建立儲存格並設定儲存格內容 // 調整列寬 //取出資料庫中的值放入表格中//上面部分代碼和之前的一樣,在輸出Excel檔案開始不同,如下 //輸出Excel檔案 try{ response.reset(); response.setContentType("application/x-download"); response.setCharacterEncoding("utf-8"); String fname = "history" + timeStamp;// Excel檔案名稱 response.setHeader("Content-disposition", "attachment; filename="+fname+".xls"); out = response.getOutputStream(); wb.write(out); out.flush(); }catch(IOException e) { e.printStackTrace(); }finally { out.close(); } }
然後就大功告成了。
如果你想瞭解的更多可以參考:
65435181
78663076
72778348?locationNum=5&fps=1
53491258
53432364
78810622
54375399
Java學習——Spring MVC從無到有利用POI建立並下載Excel