背景:想要根据一些数据,导出一个excel表并通过浏览器保存到本地。
前端jsp代码:
form.submit();
$.ajax({
type: 'post',
data:params,
url: 'exportSummaryReport',
success: function(data) {
},
error: function(data) {
alert("数据导出失败,请联系管理员");
}
});
后台controller代码:
@RequestMapping(value = "/exportSummaryReport",method = RequestMethod.POST,produces = "text/plain;charset=utf-8")
@ResponseBody
public void exportSummaryReport(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("*****") String ******NO,
@RequestParam("*****") String *****NO ) {
*********
ExcelUtil.exportSummaryReport(dtoList, changedDtoList, response);
}
工具类(ExcelUtil..exportSummaryReport)中代码:
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("test", "UTF-8")+".xls");
response.setHeader("Pragma", "No-cache");
OutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
workbook.close();
outputStream.flush();
outputStream.close();
但系统运行时,无报错也无法生成文件。最后查询时发现ajax无法传输二进制,也就是不能涉及流(具体怎么描述我也不确定),所以在提交导出文件的请求时,不能用ajax提交申请。于是就改成了
<form id="exportForm" class="sel_btn" action="exportSummaryReport" method="post" style="display: none">
<input type="text" class="col-sm-2" name="****rNO" id="****" >
<input type="text" class="col-sm-2" name="****NO" id="****" >
</form>
var form=$("#exportForm");
form.submit();
改用form表单提交的方式提交请求,表单可以一开始就写好在页面,但是隐藏起来,也可以在提交按钮的功能模块里面动态生成一个form
var form=$("<form>");//定义一个form表单
form.attr("style","display:none");
form.attr("target","");
form.attr("action","exportInvoiceExcel");
$("body").append(form);
form.submit();
总结:ajax无法使用文件流,所以提交申请时采用form表单的形式提交