Java學習——Spring MVC從無到有利用POI建立並下載Excel

來源:互聯網
上載者:User

標籤:描述   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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.