当前位置: 首页 > article >正文

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

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

    downloadFile(record) {
      let that = this
      let apiBaseUrl = window._CONFIG['domianURL'] || "/jeecg-boot";
      return new Promise((resolve, reject) => {
        axios({
          url: apiBaseUrl + `/ABC/ABC?id=${record.id}&date=${record.monthTime}`,
          method: "GET",
          responseType: "blob", // important
          withCredentials: true,
          headers: {
            "X-Access-Token": Vue.ls.get(ACCESS_TOKEN),
          },
        }).then((response) => {
            // 处理blob响应
            const blob = new Blob([response.data]);
            const contentDisposition = response.headers["content-disposition"];

            // 错误处理:当响应是JSON时说明出错
            if (blob.type === "application/json") {
              const reader = new FileReader();
              reader.onload = () => {
                try {
                  const errData = JSON.parse(reader.result);
                  reject(errData.message || "导出失败");
                  that.$message.error(errData.message || "导出失败");
                } catch (e) {
                  reject("导出失败");
                  that.$message.error("导出失败");
                }
              };
              reader.readAsText(blob);
              return;
            }

            // 创建下载链接
            const downloadUrl = window.URL.createObjectURL(blob);
            const link = document.createElement("a");
            link.href = downloadUrl;
            let fileName = "";
            if (contentDisposition) {
              const fileNameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
              const matches = fileNameRegex.exec(contentDisposition);
              if (matches && matches[1]) {
                fileName = matches[1].replace(/['"]/g, "");

                fileName = decodeURIComponent(fileName);
                // 我这里文件名的前缀有 utf-8 所以在这里做了一个处理,如果没有,则可以注释这里
                fileName = fileName.replace(/^utf-8['"]?/, "");
              }
            }
            link.download = fileName || `export_${new Date().getTime()}.xlsx`;

            // 触发下载
            document.body.appendChild(link);
            link.click();

            // 清理资源
            window.URL.revokeObjectURL(downloadUrl);
            document.body.removeChild(link);
            resolve();
          })
          .catch((error) => {
            reject(error);
            that.$message.error("下载失败,请检查网络连接");
          });
      });
    },

其实这个通用的方法,基本可以实现所需的要求。


http://www.kler.cn/a/547512.html

相关文章:

  • 服务器虚拟化(详解)
  • zookeeper的zkCli.sh登录server报错【无法正常使用】
  • 《千多桃花一世开》:南胥月为何爱暮悬铃
  • 笔试第四十二行
  • Linux-C/C++《七、字符串处理》(字符串输入/输出、C 库中提供的字符串处理函数、正则表达式等)
  • 从零到一:开发并上线一款极简记账本小程序的完整流程
  • 数据科学之数据管理|python for Excel
  • 机器学习算法 - 随机森林之决策树初探(1)
  • java原子操作类实现原理
  • Ubuntu中离线安装Docker
  • 小米平板怎么和电脑共享屏幕
  • JavaScript设计模式 -- 外观模式
  • 从零开始-将小爱接入大模型
  • 数学建模基础训练-1:概念解析
  • VNC远程控制Mac
  • servlet中的ServletContext
  • 最大痛点理论
  • -bash:/usr/bin/rm: Argument list too long 解决办法
  • 【情感识别】SECap: Speech Emotion Captioning with Large Language Model 论文阅读
  • Lineageos 22.1(Android 15)更换开机动画