文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

(干货)前端实现导出excel的功能

2024-12-24 15:31

关注
  1. var aBlob = new Blob( array, options ); 

兼容性

mimeType[2]
在 Blob 的构造函数中options参数的接受一个参数type,这个参数代表的是媒体类型,告诉浏览器是什么类型的文件,常见的有

  1. {".3gp",    "video/3gpp"}, 
  2. {".apk",    "application/vnd.android.package-archive"}, 
  3. {".asf",    "video/x-ms-asf"}, 
  4. {".avi",    "video/x-msvideo"}, 
  5. {".bin",    "application/octet-stream"}, 
  6. {".bmp",    "image/bmp"}, 
  7. {".c",  "text/plain"}, 
  8. {".class",  "application/octet-stream"}, 
  9. {".conf",   "text/plain"}, 
  10. {".cpp",    "text/plain"}, 
  11. {".doc",    "application/msword"}, 
  12. {".docx",   "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, 
  13. {".xls",    "application/vnd.ms-excel"}, 
  14. {".xlsx",   "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, 
  15. {".exe",    "application/octet-stream"}, 
  16. {".gif",    "image/gif"}, 
  17. {".gtar",   "application/x-gtar"}, 
  18. {".gz""application/x-gzip"}, 
  19. {".h",  "text/plain"}, 
  20. {".htm",    "text/html"}, 
  21. {".html",   "text/html"}, 
  22. {".jar",    "application/java-archive"}, 
  23. {".java",   "text/plain"}, 
  24. {".jpeg",   "image/jpeg"}, 
  25. {".jpg",    "image/jpeg"}, 
  26. {".js""application/x-javascript"}, 
  27. {".log",    "text/plain"}, 
  28. {".m3u",    "audio/x-mpegurl"}, 
  29. {".m4a",    "audio/mp4a-latm"}, 
  30. {".m4b",    "audio/mp4a-latm"}, 
  31. {".m4p",    "audio/mp4a-latm"}, 
  32. {".m4u",    "video/vnd.mpegurl"}, 
  33. {".m4v",    "video/x-m4v"}, 
  34. {".mov",    "video/quicktime"}, 
  35. {".mp2",    "audio/x-mpeg"}, 
  36. {".mp3",    "audio/x-mpeg"}, 
  37. {".mp4",    "video/mp4"}, 
  38. {".mpc",    "application/vnd.mpohun.certificate"}, 
  39. {".mpe",    "video/mpeg"}, 
  40. {".mpeg",   "video/mpeg"}, 
  41. {".mpg",    "video/mpeg"}, 
  42. {".mpg4",   "video/mp4"}, 
  43. {".mpga",   "audio/mpeg"}, 
  44. {".msg",    "application/vnd.ms-outlook"}, 
  45. {".ogg",    "audio/ogg"}, 
  46. {".pdf",    "application/pdf"}, 
  47. {".png",    "image/png"}, 
  48. {".pps",    "application/vnd.ms-powerpoint"}, 
  49. {".ppt",    "application/vnd.ms-powerpoint"}, 
  50. {".pptx",   "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, 
  51. {".prop",   "text/plain"}, 
  52. {".rc""text/plain"}, 
  53. {".rmvb",   "audio/x-pn-realaudio"}, 
  54. {".rtf",    "application/rtf"}, 
  55. {".sh""text/plain"}, 
  56. {".tar",    "application/x-tar"}, 
  57. {".tgz",    "application/x-compressed"}, 
  58. {".txt",    "text/plain"}, 
  59. {".wav",    "audio/x-wav"}, 
  60. {".wma",    "audio/x-ms-wma"}, 
  61. {".wmv",    "audio/x-ms-wmv"}, 
  62. {".wps",    "application/vnd.ms-works"}, 
  63. {".xml",    "text/plain"}, 
  64. {".z",  "application/x-compress"}, 
  65. {".zip",    "application/x-zip-compressed"}, 
  66. {"",        "*/*"

导出
我们需要调取接口来获取导出文件的内容,如果我们先后端分离的话,我们需要接口给我们返回Buffer, Blob, DOMString类型的数据,DOMStrings会被编码为UTF-8。

  1. let blob = new Blob([接口返回的数据], { 
  2.     type: "application/vnd.ms-excel;charset=utf-8" 
  3. }); 

使用a标签,模拟点击a标签完成导出功能,通过URL.createObjectURL()[3]方法创建一个下载的链接地址,最后在不需要的时候URL.revokeObjectURL释放掉

  1. let downloadElement = document.createElement("a"); 
  2. let href = window.URL.createObjectURL(blob); //创建下载的链接 
  3. downloadElement.href = href; 
  4. document.body.appendChild(downloadElement); 
  5. downloadElement.click(); //点击下载 
  6. document.body.removeChild(downloadElement); //下载完成移除元素 
  7. window.URL.revokeObjectURL(href); //释放掉blob对象 

文件名的设置
文件名称通过报文头设置content-disposition属性设置,Content-Disposition参数:

  1. attachment --- 作为附件下载 
  2. inline --- 在线打开 

  1. setHeader("Content-Disposition","inline; filename=文件名.mp3"); 
  2. setHeader("Content-Disposition","attachment;filename=test.xls"); 

前端通过截取报文头里的content-disposition字段获取文件名称:

  1. downloadElement.download =decodeURI( 
  2.     res.headers["content-disposition"].split("filename=")[1] 
  3. ) || ""; //下载后文件名 

完整代码
这里的res代表后台返回的数据:

  1. config: {url: "/ExportExcel", method: "post", data: "", headers: {…}, baseURL: "/api/", …} 
  2. data: Blob {size: 5120, type: "application/vnd.ms-excel"
  3. headers: {connection"close", content-disposition: "attachment;filename=xxx.xls", content-encoding: "gzip", content-length: "1455", content-type: "application/vnd.ms-excel;charset=UTF-8", …} 
  4. request: XMLHttpRequest {readyState: 4, timeout: 30000, withCredentials: false, upload: XMLHttpRequestUpload, onreadystatechange: ƒ, …} 
  5. status: 200 
  6. statusText: "OK" 

前端代码

  1. let blob = new Blob([res.data], { 
  2.     type: "application/vnd.ms-excel;charset=utf-8" 
  3. }); 
  4. let downloadElement = document.createElement("a"); 
  5. let href = window.URL.createObjectURL(blob); //创建下载的链接 
  6. downloadElement.href = href; 
  7. downloadElement.download = 
  8. decodeURI( 
  9.     res.headers["content-disposition"].split("filename=")[1] 
  10. ) || ""; //下载后文件名 
  11. document.body.appendChild(downloadElement); 
  12. downloadElement.click(); //点击下载 
  13. document.body.removeChild(downloadElement); //下载完成移除元素 
  14. window.URL.revokeObjectURL(href); //释放掉blob对象 

写在最后
导出功能多种多样,根据浏览器的不同和需求的不同会有不同的问题出现其中的坑还是比较多的,适合自己需求的才是最好的。

 

来源:小丑的小屋内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯