由于ExtJs的提交请求都是异步的,返回内容都是json等格式,
所以不能用ExtJs的操作去请求导出操作。
方法1:
url重定位,window.location.href或者window.open等去请求操作,
前台请求window.location.href="../exportExcel.action",
struts配置:
<result name="exportExcel" type="stream">
<param name="ContentType">application/vnd.ms-excel</param>
<param name="inputName">file</param>
<param name="contentDisposition">attachment;filename=${exportfilename}</param>
<param name="bufferSize">4096</param>
</result>
后台返回文件的流file,和对应的文件名exportfilename
正常时没有任何问题
这样后台有异常或者导出内容异常等,
画面重定位找不到,画面就会崩掉。
方法2:
使用传统页面提交方式,Ext页面中html属性里放一个form和一个iframe,如下
<form id="exportform" target="exportframe"></form><iframe id="exportframe" name="exportframe" border="0" frameborder="0" width="0" height="0"></iframe>
form提交时请求导出文件,
后台如下:
response.addHeader("Content-Type", "application/vnd.ms-excel");
response.addHeader("Content-Disposition", "attachment;fileName=\"" + fileName + ".xls\"");
workbook.write(response.getOutputStream());
catch(FileNotFoundException e){
e.printStackTrace();
response.getWriter().write("<Script language='javascript'>alert('MSG0009');</Script>");
}
这样正常时也不用打开新的页面去下载,直接利用隐藏的iframe实现,效果比较好。
异常时,可以利用response执行前台脚本,提示各种错误信息,可以交互。
而且这个调用不需要struts配置等。
搞了好久才出来这个方法,希望对大家有用。