如何将 10000 到 40000 行的 table 导出为 excel
how to export table as excel with 10000 to 40000 rows
我正在将 html table 导出为 excel 和 javascript (window.location.href= uri + base64(tableData)
),这对于 1500 行工作正常。因为 window.location.href
有一定的字符串长度限制。但我需要导出 40000 行。
我也尝试过使用 锚标签 href。但它也不起作用。
那么我们可以将部分数据分配给 window.location.href
或者有任何替代解决方案吗?
一种方法是创建一个 Blob out of your data, convert it to object URL and set result URL as an anchor href with 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 的库可以做到这一点。
我将编码后的字符串分配给 window.location.href,这是有大小限制的。它适用于小数据。对于大数据,我们需要改变这种方式,我使用了 Blob,谢谢@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 行。谢谢大家
您可以使用出色的 FileSaver.js 来保存在客户端生成的数据,以解决浏览器差异(safari 的新选项卡,ie/edge 的 msSaveAs 以及那些使用下载属性的谁支持)
saveAs(new Blob([tableData]), 'filename.csv')
不需要base64编码...
我正在将 html table 导出为 excel 和 javascript (window.location.href= uri + base64(tableData)
),这对于 1500 行工作正常。因为 window.location.href
有一定的字符串长度限制。但我需要导出 40000 行。
我也尝试过使用 锚标签 href。但它也不起作用。
那么我们可以将部分数据分配给 window.location.href
或者有任何替代解决方案吗?
一种方法是创建一个 Blob out of your data, convert it to object URL and set result URL as an anchor href with 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 的库可以做到这一点。
我将编码后的字符串分配给 window.location.href,这是有大小限制的。它适用于小数据。对于大数据,我们需要改变这种方式,我使用了 Blob,谢谢@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 行。谢谢大家
您可以使用出色的 FileSaver.js 来保存在客户端生成的数据,以解决浏览器差异(safari 的新选项卡,ie/edge 的 msSaveAs 以及那些使用下载属性的谁支持)
saveAs(new Blob([tableData]), 'filename.csv')
不需要base64编码...