参考:https://www.cnblogs.com/xbq8080/p/7344258.htmljavascript
1.Ajax请求导出Excel的问题描述:html
前端发起Ajax请求get或post,后台使用Poi生成excel文件,最后用response输出excel文件流。整个调用过程都没有报任何错,excel文件也生成在本地,但浏览器没有弹出文件下载,毫无反应。前端
2.解决:java
开始一直觉得是浏览器兼容性,或后台输出文件流代码有问题,调了半天,也都同样,不报任何错。后来上网搜发如今相似的问题,Ajax导出excel没反应,网上有人说不能使用ajax,换成地址重定向 window.location.href 就行,一换还真好使。ajax
function() { var stime = $("#layerdate").val(); var etime = $("#layerdate2").val(); window.location.href = "${pageContext.request.contextPath}/user/export?stime="+stime+"&etime="+etime; }
可是当须要传一个很大数据到后台(window.location.href= actionUrl + "?" + data;),就会出问题了,固然,当数据量不大的时候,使用这种方式是极好的。致使这个问题的缘由是各类浏览器对URL解析的长度限制是不一样的。chrome
解决方法就换成了使用隐藏form来执行导出操做,以下:浏览器
<a href="javascript:void(0)" onclick="exportExcel()">导出1</a> // 导出,使用这种方式 能够,使用 ajax请求不能够 导出excel function exportExcel(){ var form = $("<form>"); form.attr('style', 'display:none'); form.attr('target', ''); form.attr('method', 'post'); form.attr('action', '${pageContext.request.contextPath}/user/export'); var input1 = $('<input>'); input1.attr('type', 'hidden'); input1.attr('name', 'item'); input1.attr('value', 'test'); /* JSON.stringify($.serializeObject($('#searchForm'))) */ $('body').append(form); form.append(input1); form.submit(); form.remove(); }
3.总结:app
导出excel为何不能用ajax请求?post
由于导出excel,其实是文件下载,后台须要往前端(浏览器)写文件流的。而Ajax请求获取数据都是“字符串”,整个交互传输用的都是字符串数据,它无法解析后台返回的文件流,但浏览器能够。大数据
4.Ajax与Form表单提交的区别:
Ajax提交不会自动刷新页面,须要手动处理。
Form表单提交在数据提交后会刷新页面,若是是Post提交,点击刷新浏览器会提示 是否再次提交。