【问题标题】:How to export and download data into valid xlsx format on client side?如何在客户端将数据导出和下载为有效的 xlsx 格式?
【发布时间】:2020-02-16 16:41:01
【问题描述】:

我从后端 api 获取学生数据列表到一个有效的 excel 文件中,该文件在点击端点 /api/v1.0/students/students-xlsx/ 时被下载,但是当我打电话时在客户端此端点显示不可读的格式并作为损坏的 excel 文件下载。

我遵循了一些 stackoverflow 建议,例如 atob、encodeURI 响应数据并添加特定类型 (UTF-8),但它失败了。我仍然收到带有奇怪字符的损坏文件。

excelFileDownload() {
  this.$http.get(this.exportXLUrl)
    .then((response) => {
      response.blob().then(() => {
        const blob = new Blob([response.body], { type: response.headers.get('content-type') });
        const filename = response.headers.map['content-disposition'][0].split('filename=')[1];
        const link = document.getElementById('download-excel-file');
        link.href = window.URL.createObjectURL(blob);
        link.download = filename.split('"').join('');
        link.style.display = 'block';
        link.click();
      });
    });
},

我希望输出与我仅使用可浏览 API 调用端点时相同 - 这为我提供了具有可读字符的适当 xls 格式文件。但在客户端,我根本没有得到。都坏了。任何帮助将不胜感激,以改进我的代码。

【问题讨论】:

  • 如果你把yourdomain.com/api/v1.0/students/students-xlsx/放在浏览器上,浏览器会下载文件吗?
  • 是的@ItsaMeTuni

标签: javascript excel vue.js ecmascript-6


【解决方案1】:

如果你愿意使用XMLHttpRequest

(未经测试)

const xhr = new XMLHttpRequest();
xhr.open('GET', this.exportXLUrl, true);
xhr.responseType = 'blob';

xhr.addEventListener('load', () =>
{
    if(xhr.status == 200)
    {
        const url = window.URL.createObjectURL(xhr.response);

        const contentDisposition = xhr.getResponseHeader('content-disposition');
        const filename = /filename=([^;]*)/.exec(contentDisposition)[1];

        const link = document.getElementById('download-excel-file');
        link.href = window.URL.createObjectURL(blob);
        link.download = filename.split('"').join('');
        link.style.display = 'block';
        link.click();

        //Dont forget to revoke it
        window.URL.revokeObjectURL(url);
    }
    else
    {
        //error
    }
});

xhr.addEventListener('error', err =>
{
    //error
});

xhr.send();

【讨论】:

  • 我试过这种方法,但它不起作用。我在这里使用 Vue.JS
  • 会发生什么?任何控制台错误?您在服务器响应中发送了哪些标头?
  • GET /api/v1.0/students/students-xlsx/ HTTP/1.1 Host: [Host URL] Connection: keep-alive Accept: application/json, text/plain, */* X-Requested-With: XMLHttpRequest Authorization: Token 6200840e7f0bd84c06c9d990fc5abcd670475f83 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin Referer:[url] Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;
  • 没有控制台错误。只是以无法读取的格式下载的字符,如下所示:PK¢VOdocProps/app.xmlM=1DÿÊq½·AÁBb@ÐR°²{/dC²B~¾9ÁnoFß g*â©-Tã"¶N]§nh¥cy;çÎÏHI«Ô¨ ¥æMþFrxNæê±pe'Ã¥! ÿrmÞ©Ô5ï&õÖð;i^PKAMb±PK¢VOdocProps/core.xmlÍQKÃ0Ç¿ä½$e¡ëcO ŷܶä¤Ý··­[èð1wÿüîwpµÊt S1Ã|3ø6deâ¢Èæ^çrL±¹ï×4>Ó¢6ú 9¿¤­& °5µ5Ê$ÔÔ¥3Þ?S;ìlÑc ¢Àib<
  • 响应头:HTTP/1.1 200 OK X-Powered-By: Express connection: close server: gunicorn/19.9.0 date: Tue, 22 Oct 2019 02:52:13 GMT content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet content-disposition: attachment; filename="students.xlsx" vary: Accept, Accept-Language, Cookie, Origin allow: GET, HEAD, OPTIONS x-frame-options: SAMEORIGIN content-length: 22112 content-language: en strict-transport-security: max-age=31536000 via: 1.1 vegur
【解决方案2】:

我需要通过 get 请求在 headers 和 responseType 中传递 Content-type,如下所示:

headers: { 'Content-Type': 'application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet' },
responseType: 'arraybuffer'

现在可以正常使用了。

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    相关资源
    最近更新 更多