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