1. 程式人生 > >利用ajax匯出Excel檔案

利用ajax匯出Excel檔案

記得之前寫過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();
		}
		
	}