目录

一、场景介绍

二、设计过程

三、借助第三方平台来下载文件

四、不稳定性解决


一、场景介绍

按照模版导入excel文件,把符合规则的数据更新后,把异常数据导出excel,并记录导出原因。导入导出需要一键操作!!!

二、设计过程

用ajax上传文件,ajax上传成功后,在ajax的success中嵌套ajax实现文件的下载。

前端代码如下:

<div id="excelUpForm" class="jd_hide"><form id="excelUpBD"  method="post" enctype="multipart/form-data"><div><input name="file" type="file" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/></div></form>
</div><script>function () {var formData = new FormData($('#excelUpBD')[0]);if($('#excelUpBD')[0].elements[0].value.length == 0 || $('#excelUpBD')[0].elements[0].value == ""){alert("请选择文件");return;}$.ajax({url:"/rest/test/excelUpload",data: formData,type:"POST",dataType:'json',cache: false,processData: false,contentType: false,async : false}).done(function (result) {if (result.sucess){confirm(result.msg);location.reload();$.ajax({url:"/rest/test/export",data: JSON.stringify(result.data),type:"POST",dataType:'json',cache: false,processData: false,contentType: 'application/json;charset=UTF-8',async : false}).done(function () {})}else {confirm(result.msg);location.reload();}})}
</script>

后台代码操作结果正常,但是导出的excel并没有在页面显示,这是为什么呢???

因为excel的导出流是二进制流,而ajax的输出为dataType类型如下:

类型 解释
”xml” 返回 XML 文档,可用 jQuery 处理
”html” 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行
”script” 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 “cache” 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
”json” 返回 JSON 数据
”jsonp” JSONP 格式。使用 JSONP 形式调用函数时,如 “myurl?callback=?” jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。 
”text” 返回纯文本字符串

dataType的输出类型中没有二进制流,所以导出excel输出的二进制流无法转出为字符串,从而excel导出无响应。

那么,证明了一点:ajax不可以导出或下载文件。

在一键导入excel并导出excel的文件很大的时候,怎样解决这个问题呢?

显然用ajax导入文件,用ajax返回要导出的大量数据,这样导出数据的传递是很方便的,文件的导出怎样实现?我们可以用ajax的底层代码实现,即用XMLHttpRequest,XMLHttpRequest可以实现ajax的功能,有可以设置返回值得类型

responseType = 'blob'

设置返回值为blob:二进制大对象类型,从而实现ajax导出文件的功能。代码如下:

<div id="excelUpForm" class="jd_hide"><form id="excelUpBD"  method="post" enctype="multipart/form-data"><div><input name="file" type="file" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/></div></form>
</div><script>function () {var formData = new FormData($('#excelUpBD')[0]);if($('#excelUpBD')[0].elements[0].value.length == 0 || $('#excelUpBD')[0].elements[0].value == ""){alert("请选择文件");return;}$.ajax({url:"/rest/test/excelUpload",data: formData,type:"POST",dataType:'json',cache: false,processData: false,contentType: false,async : false}).done(function (result) {if (result.sucess){confirm(result.msg);location.reload();var xhr = new XMLHttpRequest();xhr.open('post', '/rest/test/export', true);xhr.responseType = 'blob';xhr.setRequestHeader('Content-Type','application/json;charset=utf-8');xhr.send(JSON.stringify(result.data));xhr.onload = function () {if (this.status == 200) {var blob = this.response;//文件后缀名var d=new Date(),str='';str +=d.getFullYear()+'年'; //获取当前年份str +=d.getMonth()+1+'月'; //获取当前月份(0——11)str +=d.getDate()+'日';str +=d.getHours()+'时';str +=d.getMinutes()+'分';str +=d.getSeconds()+'秒';transferDownload(blob,"test_"+str+".xls");}}function transferDownload(blob, filename) {// 创建隐藏的可下载链接var yLink = document.createElement('a');yLink.download = filename;yLink.style.display = 'none';// 字符内容转变成blob地址yLink.href = URL.createObjectURL(blob);// 触发点击document.body.appendChild(yLink);yLink.click();// 然后移除document.body.removeChild(yLink);}}else {confirm(result.msg);location.reload();}})}
</script>

perfect!!问题解决了!!!excel正常导出。

三、借助第三方平台来下载文件

在上述解决办法之外,还有一种解决思路,是在文件上传成功后,把过滤出来的数据转化为excel的HSSFWorkbook,再转化为

InputStream、再转化为File文件上传文件到某个平台A上,返回平台A上文件存储的链接,直接用链接打开。这样实现文件的上传在本地,文件的下载在第三方平台上,不会出现ajax返回文件流格式的不匹配。实现如下:

<div id="excelUpForm" class="jd_hide"><form id="excelUpBD"  method="post" enctype="multipart/form-data"><div><input name="file" type="file" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/></div></form>
</div><script>function () {var formData = new FormData($('#excelUpBD')[0]);if($('#excelUpBD')[0].elements[0].value.length == 0 || $('#excelUpBD')[0].elements[0].value == ""){alert("请选择文件");return;}$.ajax({url:"/rest/test/excelUpload",data: formData,type:"POST",dataType:'json',cache: false,processData: false,contentType: false,async : false}).done(function (result) {if (result.sucess){layer.alert(result.msg);$("#excelUpForm").dialog("close")location.reload();$.ajax({url:"/rest/test/export",data: JSON.stringify(result.data),type:"POST",dataType:'json',cache: false,processData: false,contentType: 'application/json;charset=UTF-8',async : false}).done(function (resultSe) {if (resultSe.sucess) {location.href=resultSe.data;}else{layer.alert(resultSe.msg);}})}else {layer.alert(result.msg);$("#excelUpForm").dialog("close");}})}
</script>

四、不稳定性解决

在上述二、三中的实现方式出现了正确的导出结果,但是出现导出结果不稳定的问题,后台没有任何问题,前端的导出excel页面有时有反应,有时候没有反应,why?

在ajax中,请求成功后先location.reload();后进行excel文件的导出,这样会出现一个问题,当页面刷新的快,excel文件导出的请求操作后台返回却发现前端页面已经刷新,从而不能接收excel导出的返回值,最终结论就是:excel是否能导出取决于location.reload();刷新的速度。解决办法:在ajax中不进行页面的刷新或者是把刷新放在最后一步,刷新操作不能放在ajax的中间步骤,否则会出现后续步骤的返回值无法接收。

ajax嵌套ajax下载excel文件之问题解决相关推荐

  1. php通过ajax下载文件,PHP使用ajax的post方式下载excel文件简单示例

    本文实例讲述了PHP使用ajax的post方式下载excel文件.分享给大家供大家参考,具体如下: 项目需求,前端发起ajax请求,后端生成excel并下载,同时需要在header头中,带上token ...

  2. PHP使用ajax的post方式下载excel文件简单示例

    本文实例讲述了PHP使用ajax的post方式下载excel文件.分享给大家供大家参考,具体如下: 项目需求,前端发起ajax请求,后端生成excel并下载,同时需要在header头中,带上token ...

  3. php通过ajax下载文件,通过Ajax如何请求下载Execl文件

    本篇文章给大家分享的是关于通过Ajax如何请求下载Execl文件,内容很不错,有需要的朋友可以参考一下,希望可以帮助到大家. 通过Ajax请求下载Execl 的问题,掉进一个坑里半个多小时,特此来记录 ...

  4. 前端下载excel文件功能的三种方法

    1 从后端接收json数据,前端处理生成excel下载 JsonExportExcel的github地址:https://github.com/cuikangjie/JsonExportExcel 这 ...

  5. react接收后端文件_React获取Java后台文件流并下载Excel文件流程解析

    记录使用blob对象接收java后台文件流并下载为xlsx格式的详细过程,关键部分代码如下. 首先在java后台中设置response中的参数: public void exportExcel(Htt ...

  6. java文件流下载excel_React获取Java后台文件流下载Excel文件

    记录使用blob对象接收java后台文件流并下载为xlsx格式的详细过程,关键部分代码如下. 首先在java后台中设置response中的参数: public void exportExcel(Htt ...

  7. Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法

    java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...

  8. IE中点击链接下载EXCEL文件直接以乱码方式打开解决

    我需要在页面上通过javascript控制,点击一个链接下载excel文件模板,总觉得方法都写对了,可每次点击都是新开一个窗口,显示的全是乱码.几日以来一直被这个问题困扰,今天无意中得知这个方法,试了 ...

  9. springboot访问下载/resource/static下的静态资源;下载excel文件损坏,打不开

    放文件 直接把文件放到resource下的static文件夹中 看编译结果 启动之后看看是否被编译了 访问,下载 然后在浏览器输入下面地址就能自动下载文件了 http://localhost:8002 ...

最新文章

  1. Linux网络性能评估工具iperf
  2. python3根据地址批量获取百度地图经纬度
  3. P3805 【模板】manacher 算法【马拉车】
  4. PAT——个位数统计(1021)
  5. 提权学习之旅——Linux操作系统提权
  6. 如何实现一个遵从设计原则的积分兑换系统2
  7. SPPNet算法解析
  8. Selenium爬虫 -- 无界面爬取:无头模式及其他参数
  9. 台式机XP系统调节屏幕亮度
  10. 中心药库管理系统 v6.85 是什么
  11. VS2022怎么取消背景或者删除主题
  12. 前国际奥委会主席罗格去世,敬生命!这些残奥特写太戳了
  13. oracle导出BOM文件,ORACLE ERP导数据(BOM清单)
  14. 如何用搜狗拼音输入法输入希腊字母
  15. Web前端_邮箱的正则表达式
  16. Linux下默认字体是什么,linux默认字体是什么
  17. C语言关于指针知识点总结【2】
  18. 简单5步,从0开始搭建你的第一款小程序
  19. Nginx总结(反向代理、负载均衡、动静分离)篇
  20. BlackArch-Tools

热门文章

  1. 爬取点评成都数据,只为告诉你哪家火锅最好吃
  2. 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro ehcache websocket
  3. 基于SkeyeVSS二次开发实现自己的安防监控设备网络摄像机、硬盘录像机、国标设备等的WEB无插件直播点播解决方案
  4. cadence有关的学习
  5. C语言训练:输入年份,月份,输出月份的天数(switch,if实现)。
  6. 线上服务Java进程假死快速排查、分析
  7. 运动会计算机学院的方队,急求计算机学院运动会方队口号
  8. 匿名内部类,最全讲解
  9. unity粒子系统设置粒子的长度,旋转等
  10. 对于面试,如何提高几率,和一些技巧