vue 文件下载(导出)excel的方法

打印 上一主题 下一主题

主题 1013|帖子 1013|积分 3039

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目前有一个随处功能的需求,这是我用过DeepSeek生成的导出(下载)excel的一个方法。
1.excel的文件名是后端生成的,放在了响应头那边。
2.这里也可以自己订定文件名。
3.axios用的是原生的axios,不要用处理过的,有拦截等等。

  1.     downloadFile(record) {
  2.       let that = this
  3.       let apiBaseUrl = window._CONFIG['domianURL'] || "/jeecg-boot";
  4.       return new Promise((resolve, reject) => {
  5.         axios({
  6.           url: apiBaseUrl + `/ABC/ABC?id=${record.id}&date=${record.monthTime}`,
  7.           method: "GET",
  8.           responseType: "blob", // important
  9.           withCredentials: true,
  10.           headers: {
  11.             "X-Access-Token": Vue.ls.get(ACCESS_TOKEN),
  12.           },
  13.         }).then((response) => {
  14.             // 处理blob响应
  15.             const blob = new Blob([response.data]);
  16.             const contentDisposition = response.headers["content-disposition"];
  17.             // 错误处理:当响应是JSON时说明出错
  18.             if (blob.type === "application/json") {
  19.               const reader = new FileReader();
  20.               reader.onload = () => {
  21.                 try {
  22.                   const errData = JSON.parse(reader.result);
  23.                   reject(errData.message || "导出失败");
  24.                   that.$message.error(errData.message || "导出失败");
  25.                 } catch (e) {
  26.                   reject("导出失败");
  27.                   that.$message.error("导出失败");
  28.                 }
  29.               };
  30.               reader.readAsText(blob);
  31.               return;
  32.             }
  33.             // 创建下载链接
  34.             const downloadUrl = window.URL.createObjectURL(blob);
  35.             const link = document.createElement("a");
  36.             link.href = downloadUrl;
  37.             let fileName = "";
  38.             if (contentDisposition) {
  39.               const fileNameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
  40.               const matches = fileNameRegex.exec(contentDisposition);
  41.               if (matches && matches[1]) {
  42.                 fileName = matches[1].replace(/['"]/g, "");
  43.                 fileName = decodeURIComponent(fileName);
  44.                 // 我这里文件名的前缀有 utf-8 所以在这里做了一个处理,如果没有,则可以注释这里
  45.                 fileName = fileName.replace(/^utf-8['"]?/, "");
  46.               }
  47.             }
  48.             link.download = fileName || `export_${new Date().getTime()}.xlsx`;
  49.             // 触发下载
  50.             document.body.appendChild(link);
  51.             link.click();
  52.             // 清理资源
  53.             window.URL.revokeObjectURL(downloadUrl);
  54.             document.body.removeChild(link);
  55.             resolve();
  56.           })
  57.           .catch((error) => {
  58.             reject(error);
  59.             that.$message.error("下载失败,请检查网络连接");
  60.           });
  61.       });
  62.     },
复制代码
实在这个通用的方法,基本可以实现所需的要求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表