我使用javascript(window.location.href= uri + base64(tableData)
)将html表导出为excel,这适用于1500行。因为window.location.href
有一些限制字符串长度。但我需要导出40000行。
我还尝试使用锚标记href 。但它也没有用。
那么我们可以将数据部分分配给window.location.href
还是有任何替代解决方案?
答案 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编码...