利用ajax导出Excel文件

来源:互联网 发布:国家顶级域名 中文域名 编辑:程序博客网 时间:2024/05/29 23:48

记得之前写过ajax无法弹出保存下载对话框,就直接使用form表单进行提交,下载Excel的。但是如果需要传递参数的话,需要使用隐藏空间,有时候还有些麻烦,而使用ajax传递参数很方便啊?!于是我们可以通过ajax导出Excel

htm代码如下:

<button type="button" class="btn green" onclick="rptDownLoad()"> 报 表 下 载  </button>
javaScript脚本代码如下:

function rptDownLoad(){var rptId = $("#rptSelect").val();var date = $("#dateSelect").val();                var form = $("<form>");        form.attr('style', 'display:none');        form.attr('target', '');        form.attr('method', 'post');        form.attr('action', '/ODSMSPortlet/report/reportSys!exportRpt.action');        var input1 = $('<input>');        input1.attr('type', 'hidden');        input1.attr('name', 'rptId');        input1.attr('value', rptId);        var input2 = $('<input>');        input2.attr('type', 'hidden');        input2.attr('name', 'date');        input2.attr('value', date);        $('body').append(form);        form.append(input1);        form.append(input2);        form.submit();        form.remove();}
Action中处理如下:

/** * 报表下载 */public void exportRpt(){setDataObject();try{//项目中封装的dto可以直接获取js中传递的date和rptIdString date = dto.getInput("date").toString();dhlCommonService.queryForObject("reportSys.selectRptList", dto);String rptName = dto.getOutputForJSONObject().getString("rptName");//获取报表标题中英文数组String header = dto.getOutputForJSONObject().getString("upHeaders");String headers[] = header.split("\\|");int len = headers.length;String name[] = new String[len];  //title为英文标题String title[] = new String[len];//name为中文标题int index = 0;for(int i = 0 ; i<len ; i++){name[index] = headers[i].split("#")[0];title[index] = headers[i].split("#")[1];index++;}//查询sql,获取报表明细String sql = dto.getOutputForJSONObject().getString("sqlDesc");Map<String, Object> map = new HashMap<String,Object>();map.put("cycleId", date);dto.addInput("paramMap", map); dhlCommonService.queryJSONArrayBySql(sql, dto);JSONArray rptArray = dto.getOutputForJSONArray();//设置输出流OutputStream out = response.getOutputStream(); response.reset();String fileName = rptName+"_"+date;// 文件名 response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("gbk"),"iso8859-1")+".xlsx");response.setContentType("application/x-download; charset=UTF-8");//生成Excel sheet        HSSFWorkbook wb = new HSSFWorkbook();           HSSFSheet sheet = wb.createSheet(fileName);                 //设置标题样式        HSSFCellStyle headStyle = wb.createCellStyle();         headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);        headStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);        headStyle.setFillForegroundColor((short)13);        HSSFFont font = wb.createFont();        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);        headStyle.setFont(font);                //设置内容样式        HSSFCellStyle style = wb.createCellStyle();          style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式                  HSSFRow row = sheet.createRow(0);        HSSFCell cell = null;                //为Excel添加表头        for(int i = 0 ; i<len ; i++){        cell = row.createCell(i);        cell.setCellValue(name[i]);         cell.setCellStyle(headStyle);                         //设置列表宽度        sheet.setColumnWidth(i,name[i].toString().length() * 800);         }        //为Excel添加数据        for(int j = 0 ; j<rptArray.size() ; j++){        JSONObject jo = (JSONObject) rptArray.get(j);        row = sheet.createRow(j+1);        for(int k = 0 ; k<title.length ; k++){ //按照标题数组取值        String content = jo.get(title[k]).toString();        cell = row.createCell(k);        cell.setCellValue(content);        cell.setCellStyle(style);        }                }                        //将excel写入到response输出流        wb.write(out);        response.getOutputStream().flush();              response.getOutputStream().close(); }catch(Exception e){e.printStackTrace();}}



0 0