首页 技术 正文
技术 2022年11月21日
0 收藏 628 点赞 2,193 浏览 6069 个字

最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败。。。。

debug调试发现var excel拼接的table字符串,超出了var的长度限制;幸好网上有前辈的解决方案~~~膜拜ing

参考网址:https://blog.csdn.net/b7410852963/article/details/51197552

需要自己去理解下 JavaScript Blob对象

/***导出excel文件
//例子:
var data = [{ userName: 'lily', age: 28, job: "teacher", city: "广州" },{ userName: 'lucy', age: 19, job: "doctor", city: "深圳" }];
if (data == '')return;
var title = [{ userName: '姓名' }, { job: '工作' }, { age: '年龄' }, { city: '城市' }];
toExcel("dataExport", data, title);
***//***toExcel:
* FileName文件名
* JSONData导出的数据
* ShowLabel表头
*/
var DownloadEvt = null;
function toExcel(FileName, JSONData, ShowLabel) {
var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData; var docData = new StringBuffer(); // Header
var innerHTML = new StringBuffer();
docData.append('<table><thead>');
for (var i = 0; i < ShowLabel.length; i++) {
for (var key in ShowLabel[i]) {
innerHTML.append('<td>' + ShowLabel[i][key] + '</td>\r');
}
}
docData.append('<tr>\r' + innerHTML.toString() + '</tr>');
docData.append('</thead><tbody>'); // Row Vs Column
for (var i = 0; i < arrData.length; i++) {
var tdRow = new StringBuffer();
for (var y = 0; y < ShowLabel.length; y++) {
for (var k in ShowLabel[y]) {
if (ShowLabel[y].hasOwnProperty(k)) {
tdRow.append('<td style="vnd.ms-excel.numberformat:@">' + (arrData[i][k] === null ? '' : arrData[i][k]) + '</td>\r');
}
}
}
docData.append('<tr>\r' + tdRow.toString() + '</tr>');
} docData.append('</tbody></table>'); console.log("docData:",docData); var docFile = new StringBuffer(); docFile.append('<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">');
docFile.append('<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">');
docFile.append("<head>");
docFile.append("<!--[if gte mso 9]>");
docFile.append("<xml>");
docFile.append("<x:ExcelWorkbook>");
docFile.append("<x:ExcelWorksheets>");
docFile.append("<x:ExcelWorksheet>");
docFile.append("<x:Name>");
docFile.append("{worksheet}");
docFile.append("</x:Name>");
docFile.append("<x:WorksheetOptions>");
docFile.append("<x:DisplayGridlines/>");
docFile.append("</x:WorksheetOptions>");
docFile.append("</x:ExcelWorksheet>");
docFile.append("</x:ExcelWorksheets>");
docFile.append("</x:ExcelWorkbook>");
docFile.append("</xml>");
docFile.append("<![endif]-->");
docFile.append("</head>");
docFile.append("<body>");
for (var i = 0; i < docData.content.length; i++) {
docFile.append(docData.content[i].toString());
}
// docFile.append( docData.toString());
docFile.append("</body>");
docFile.append("</html>"); console.log('docFile:',docFile); try {
console.log('111111111')
var blob = new Blob(docFile.content, {
type: 'application/vnd.ms-excel;charset=UTF-8;'

});

console.log("blob.size===" + blob.size);
saveAs(blob, FileName + '.xlsx');
} catch (e) {
console.log('22222222222')
downloadFile(FileName + '.xlsx',
'data:application/vnd.ms-excel;base64,',
docFile.toString());
}
}function StringBuffer() {
this.content = new Array;
}
StringBuffer.prototype.append = function(str) {
this.content.push(str);
}
StringBuffer.prototype.prepend = function(str) {
this.content.unshift(str);
}
StringBuffer.prototype.toString = function() {
return this.content.join("");
}
function saveAs(blob, filename) { var type = blob.type;
var force_saveable_type = 'application/octet-stream';
if (type && type != force_saveable_type) { // 强制下载,而非在浏览器中打开
var slice = blob.slice || blob.webkitSlice || blob.mozSlice;
blob = slice.call(blob, 0, blob.size, force_saveable_type);
} var url = URL.createObjectURL(blob);
var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
save_link.href = url;
save_link.download = filename; console.log('save_link:',save_link); var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
save_link.dispatchEvent(event);
URL.revokeObjectURL(url);
}function downloadFile(filename, header, data) { var ua = window.navigator.userAgent;
if (ua.indexOf("MSIE ") > 0 || !!ua.match(/Trident.*rv\:11\./)) {
// Internet Explorer (<= 9) workaround by Darryl (https://github.com/dawiong/tableExport.jquery.plugin)
// based on sampopes answer on http://stackoverflow.com/questions/22317951
// ! Not working for json and pdf format !
var frame = document.createElement("iframe"); if (frame) {
document.body.appendChild(frame);
frame.setAttribute("style", "display:none");
frame.contentDocument.open("txt/html", "replace");
frame.contentDocument.write(data);
frame.contentDocument.close();
frame.focus(); frame.contentDocument.execCommand("SaveAs", true, filename);
document.body.removeChild(frame);
}
}
else {
var DownloadLink = document.createElement('a'); if (DownloadLink) {
DownloadLink.style.display = 'none';
DownloadLink.download = filename; console.log((header + base64encode(data)).length); if (header.toLowerCase().indexOf("base64,") >= 0)
DownloadLink.href = header + base64encode(data); else
DownloadLink.href = encodeURIComponent(header + data); document.body.appendChild(DownloadLink); if (document.createEvent) {
if (DownloadEvt == null)
DownloadEvt = document.createEvent('MouseEvents'); DownloadEvt.initEvent('click', true, false);
DownloadLink.dispatchEvent(DownloadEvt);
}
else if (document.createEventObject)
DownloadLink.fireEvent('onclick');
else if (typeof DownloadLink.onclick == 'function') DownloadLink.onclick(); /*document.body.removeChild(DownloadLink);*/
}
}
} function base64encode(input) {
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = utf8Encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
keyStr.charAt(enc1) + keyStr.charAt(enc2) +
keyStr.charAt(enc3) + keyStr.charAt(enc4);
}
return output;
} function utf8Encode(string) {
string = string.replace(/\x0d\x0a/g, "\x0a");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if ((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,999
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,511
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,357
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,140
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848