记得之前写过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和rptId String 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(); } }