利用ajax导出Excel文件

时间:2021-08-08 14:45:33

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