【问题标题】:How to store Excel file using javascript如何使用javascript存储Excel文件
【发布时间】:2015-02-16 13:52:03
【问题描述】:

我一直在尝试使用 Javascript 存储 Excel 文件,但我无法让它在所有浏览器上运行。我使用的第一个技术是 BASE64 结合数据 URL。这在 Chrome 和 Firefox 中运行良好,但 IE en Safari 不适用于这种技术。

newlink = document.createElement('a');
newlink.setAttribute('href', 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,' + response.data);
newlink.setAttribute('download', 'test.xlsx');
newlink.click();

我也尝试过 Blob 东西.. 但它似乎不适用于 PDF、Excel 和 MS Word 等二进制文件。

var report = response;
var str = atob(report.data);
var blob = new Blob([str], { type: report.type});
saveAs(blob, 'report.csv');

这适用于 CSV 文件,但当我对 Excel 或 Word 执行相同操作时,文件已损坏。

我正在使用 AngularJS 进行 REST 调用并通过标头使用令牌身份验证,因此仅使用 URL 并执行 window.open(url) 将不起作用,因为您将无权执行该请求。我尝试了 $resource 和 $http 但两者都得到了相同的结果。 REST API 有效,因为当我公开 URL(无需身份验证)并直接使用浏览器访问 URL 时,它会正确下载文件并且我可以打开它。因此,当我创建 Blob 时,似乎出了点问题。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: javascript angularjs excel pdf


    【解决方案1】:

    这是我目前使用的:

    arr 是要转换为 csv 的数组。为我在 IE/Chrome 上工作。

    exportToCsv("export.csv",arr);
    
    function exportToCsv(filename, rows) {
        var processRow = function (row) {
            var finalVal = '';
            for (var j = 0; j < row.length; j++) {
                var innerValue = row[j] === null ? '' : row[j].toString();
                if (row[j] instanceof Date) {
                    innerValue = row[j].toLocaleString();
                };
                var result = innerValue.replace(/"/g, '""');
                if (result.search(/("|,|\n)/g) >= 0)
                    result = '"' + result + '"';
                if (j > 0)
                    finalVal += ',';
                finalVal += result;
            }
            return finalVal + '\n';
        };
    
        var csvFile = '';
        for (var i = 0; i < rows.length; i++) {
            csvFile += processRow(rows[i]);
        }
    
        var blob = new Blob([csvFile], { type: 'text/csv;charset=utf-8;' });
        if (navigator.msSaveBlob) { // IE 10+
            navigator.msSaveBlob(blob, filename);
        } else {
            var link = document.createElement("a");
            if (link.download !== undefined) { // feature detection
                // Browsers that support HTML5 download attribute
                var url = URL.createObjectURL(blob);
                link.setAttribute("href", url);
                link.setAttribute("download", filename);
                link.style = "visibility:hidden";
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            }
        }
    }
    

    【讨论】:

    • 我对 CSV 文件没有任何问题,只有二进制文件。我也没有在客户端生成文件。该文件在服务器端生成,然后在 JSON 响应中的 REST 调用中返回。数据部分使用 BASE64 编码。如果我采用该 BASE64 字符串并在 JUnit 测试中对其进行转换并尝试打开该文件,它工作正常。这意味着 BASE64 字符串是正确的,因此在将其转换回二进制格式时客户端出现了问题。
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2019-11-13
    • 2010-09-24
    相关资源
    最近更新 更多