SSM项目文件下载方法二

来源:互联网 发布:网络结婚游戏 编辑:程序博客网 时间:2024/06/07 23:42

思路:
(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) {          }      } 
原创粉丝点击