如何将表导出为具有10000到40000行的excel

时间:2016-06-03 07:14:15

标签: javascript export-to-excel

我使用javascript(window.location.href= uri + base64(tableData))将html表导出为ex​​cel,这适用于1500行。因为window.location.href有一些限制字符串长度。但我需要导出40000行。

我还尝试使用锚标记href 。但它也没有用。

那么我们可以将数据部分分配给window.location.href还是有任何替代解决方案?

3 个答案:

答案 0 :(得分:4)

我将编码的字符串分配给window.location.href,这有大小限制。它适用于小数据。对于大数据,我们需要改变这种方式,我使用Blob's,谢谢@dandavis。在Blob中没有数据限制,我们可以导出大量文件。我之前的代码是:

var ctx = {worksheet: name || 'Worksheet', table: table.innerHTML}
window.location.href = uri + base64(format(template, ctx))

现在通过blob更新的代码是:

var blob = b64toBlob(str, "application/vnd.ms-excel");
var blobUrl = URL.createObjectURL(blob);
window.location = blobUrl;

b64toBlob函数在这里:

function b64toBlob(b64Data, contentType, sliceSize) {
    contentType = contentType || '';
    sliceSize = sliceSize || 512;

    var byteCharacters = atob(b64Data);
    var byteArrays = [];

    for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
        var slice = byteCharacters.slice(offset, offset + sliceSize);

        var byteNumbers = new Array(slice.length);
        for (var i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        var byteArray = new Uint8Array(byteNumbers);

        byteArrays.push(byteArray);
    }

    var blob = new Blob(byteArrays, {type: contentType});
    return blob;
}

它的工作非常好。我已经测试了55,000行数。谢谢大家

答案 1 :(得分:2)

这样做的一种方法是从您的数据Blob中创建convert it to object URL,并将结果URL设置为锚点href,并将download attribute设置为文件名。一个例子:

const blob = new Blob(["{a:1,b:2}"])
const blobURL = window.URL.createObjectURL(blob)
document.querySelector('a').setAttribute('href', blobURL)
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<a download="example.json">Download</a>
</body>
</html>

您显然应该关注用户浏览器是否支持这些功能。

<强>更新

看起来有一个名为excellentexport的库可以做到这一点。

答案 2 :(得分:1)

您可以使用优秀的FileSaver.js来保存在客户端生成的用于处理浏览器差异的数据(safari的新选项卡,ie / edge的msSaveAs以及支持它的人使用download属性)

saveAs(new Blob([tableData]), 'filename.csv')

无需base64编码...