1. 程式人生 > >SSM專案檔案下載方法二

SSM專案檔案下載方法二

思路:
(1)通過ajax提交表單資料至一個Controller,由引數查詢出資料集合,存入excel檔案,返回excel檔名
(2)使用js window.open()方法訪問檔案下載的Controller,下載之前生成的檔案
(3)下載完成之後刪除檔案,因為檔案儲存在專案路徑下,覺得還是刪掉比較好,日後優化可以設定一個定時任務,定期刪掉也行。

<form role="form"  method="post" id="speedFrom">
    .......表單內容
    <div class="form-group">
    <button
type="button" class="btn btn-info" id="dlspeed" >
下載資料檔案</button> </div> </form>

button 繫結事件

$(document).ready(function() {
            //按鈕下載資料檔案
            $("#dlspeed").click(function(){
                var url="[[@{/dl}]]";
                var road=$("#roads").val();
                console.log(road);
                if
(road!=null && "請選擇"!=road && typeof(road)!="undefined"){ $.post(url,$("#speedFrom").serialize(), function(data, status){ console.log(data); if("NoData"==data.info){ layer.msg('你選擇的路在此時間段內沒有資料, 請重新選擇!'
); }else{ layer.msg('已經生成資料檔案正在為您下載 !'); var fileName=data.fileName; console.log(fileName); window.open("[[@{/file/downFile}]]?filename="+fileName,'_blank'); console.log("ccccccc"); } },"json"); }else{ layer.msg('請選擇路段和時間 !'); } }); });

Controller

/**
     * 下載資料檔案
     * @param startDate
     * @param endDate
     * @param startTime
     * @param endTime
     * @param roadName
     * @param weekdays
     * @return
     */
    @RequestMapping(value = "/dl", produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
    public @ResponseBody Map<String, String> dlspeed(String startDate, String endDate,
            String startTime, String endTime, String[] roadName,
            String[] weekdays,HttpServletResponse response,HttpServletRequest request) {
        Map<String, String> map=new HashMap<String, String>(2);

        List<Integer> weeks=new ArrayList<Integer>(weekdays.length);
        for (int i = 0; i < weekdays.length; i++) {
            weeks.add(Integer.parseInt(weekdays[i]));
        }

        try {
            List<GdRoadSpeed> list = gdService.listSpeed(startDate, endDate, startTime, endTime, roadName[0], weeks);
            if(list!=null && list.size()>0){
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sd = new SimpleDateFormat("HH:mm:ss");             
                String[] firstRow=new String[5];
                firstRow[0]="date";
                firstRow[1]="time";
                firstRow[2]="road name";
                firstRow[3]=" direction ";
                firstRow[4]=" speed ";
                String[][] datas=new String[list.size()][5];
                for (int i=0;i<list.size();i++) {
                    GdRoadSpeed gds = list.get(i);
                    datas[i][0]=sdf.format(gds.getDate());
                    datas[i][1]=sd.format(gds.getTime());
                    datas[i][2]=gds.getName();
                    datas[i][3]=gds.getDirection();
                    datas[i][4]=gds.getSpeed()+"";
                }       
                String sheetName = "路段速度分析";
                // 新檔名  
                String newFileName =  roadName[0]+startDate.replaceAll("-", "")
                        +"_"+startTime.replaceAll(":", "")+"-"
                        +endDate.replaceAll("-", "")+"_"+endTime.replaceAll(":", "")+".xlsx";     
                // 獲得專案的路徑  
                ServletContext sc = request.getSession().getServletContext();  
                // 上傳位置  
                String path = sc.getRealPath("/tempFiles") + "/"; // 設定檔案儲存的目錄    
                File folder = new File(path);  
                if (!folder.exists())  {
                    folder.mkdirs();  
                }
                File file =new File(path,newFileName);
                if (!file.exists()) {  
                    file = FileUtils.createExcel(file,sheetName, firstRow, datas);
                }  
                map.put("info", "SaveData"); 
                System.out.println(file.getAbsolutePath());
                System.out.println(file.getName());
                map.put("fileName", file.getName());
            }else{
                map.put("info", "NoData");  
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            logger.error(e.getMessage());
        }

        return map;
    }

生成excel檔案的方法createExcel

public static File createExcel(File file,String sheetName,String[] firstRow,String[][] datas) throws IOException{
        // 建立HSSFWorkbook物件(excel的文件物件)
        HSSFWorkbook wkb = new HSSFWorkbook();
        // 建立新的sheet物件(excel的表單)
        HSSFSheet sheet = wkb.createSheet(sheetName);
//        sheet.setDefaultRowHeightInPoints(60);
//        sheet.setDefaultColumnWidth(20);   //設定預設列寬

        // 在sheet裡建立第一行,引數為行索引(excel的行),可以是0~65535之間的任何一個 
        HSSFRow row1 = sheet.createRow(0); //表格當中的第一行放置 列說明

        HSSFCellStyle style=wkb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        for (int i = 0; i < firstRow.length; i++) {
            // 建立單元格(excel的單元格,引數為列索引,可以是0~255之間的任何一個
            HSSFCell cell = row1.createCell(i);
            cell.setCellStyle(style);
            // 設定單元格內容
            cell.setCellValue(firstRow[i]);
        }


        // 合併單元格CellRangeAddress構造引數依次表示起始行,截至行,起始列, 截至列
//        sheet1.addMergedRegion(new CellRangeAddress(0, 0, 0, 1));

        // 在sheet裡建立其他行  
        if(datas!=null && datas.length>0){
            for (int i = 0; i < datas.length; i++) {
                if(datas[i]!=null && datas[i].length>0){
                    HSSFRow row = sheet.createRow(i+1);
                    for (int j = 0; j < datas[i].length; j++) {

                        HSSFCell cell = row.createCell(j);
                        cell.setCellStyle(style);
                        cell.setCellValue(datas[i][j]);
                    }
                }
            }
        }

        wkb.write(file);
        //write out this workbook to a new File
        return file;
    }

下載檔案的Controller

@RequestMapping("/downFile")  
    public void downFile(HttpServletRequest request,  
            HttpServletResponse response) {
        // 得到要下載的檔名  
        String fileName = request.getParameter("filename");
        try {  
            // 獲取上傳檔案的目錄  
            ServletContext sc = request.getSession().getServletContext();  
            // 上傳位置  
            String fileSaveRootPath = sc.getRealPath("/tempFiles");  
            // 得到要下載的檔案  
            File file = new File(fileSaveRootPath + "\\" + fileName);   
            // 設定響應頭,控制瀏覽器下載該檔案  
            response.setHeader("content-disposition", "attachment;filename="  
                    + URLEncoder.encode(fileName, "UTF-8"));  
            // 讀取要下載的檔案,儲存到檔案輸入流  
            FileInputStream in = new FileInputStream(fileSaveRootPath + "\\" + fileName);  
            // 建立輸出流  
            OutputStream out = response.getOutputStream();  
            // 建立緩衝區  
            byte buffer[] = new byte[1024];  
            int len = 0;  
            // 迴圈將輸入流中的內容讀取到緩衝區當中  
            while ((len = in.read(buffer)) > 0) {  
                // 輸出緩衝區的內容到瀏覽器,實現檔案下載  
                out.write(buffer, 0, len);  
            }  
            // 關閉檔案輸入流  
            in.close();  
            // 關閉輸出流  
            out.close();  
            //下載完成,刪除檔案
            file.delete();
        } catch (Exception e) {  

        }  
    }