101 lines
3.3 KiB
JavaScript
101 lines
3.3 KiB
JavaScript
var idTmr;
|
|
function getExplorer () {
|
|
var explorer = window.navigator.userAgent;
|
|
if (explorer.indexOf('MSIE') >= 0) {
|
|
// ie
|
|
return 'ie';
|
|
} else if (explorer.indexOf('Firefox') >= 0) {
|
|
// firefox
|
|
return 'Firefox';
|
|
} else if (explorer.indexOf('Chrome') >= 0) {
|
|
// Chrome
|
|
return 'Chrome';
|
|
} else if (explorer.indexOf('Opera') >= 0) {
|
|
// Opera
|
|
return 'Opera';
|
|
} else if (explorer.indexOf('Safari') >= 0) {
|
|
// Safari
|
|
return 'Safari';
|
|
};
|
|
};
|
|
function tranform (table, aId, name) {
|
|
let tableHead = table.$children[0].$el;
|
|
let tableBody = table.$children[1].$el;
|
|
let tableInnerHTML = '<thead><tr>';
|
|
if (table.$children.length !== 1) {
|
|
let len = tableBody.rows.length;
|
|
let i = -1;
|
|
while (i < len) {
|
|
if (i == -1) {
|
|
Array.from(tableHead.rows[0].children).forEach((td) => {
|
|
tableInnerHTML = tableInnerHTML + '<th>' + td.children[0].children[0].innerHTML + '</th>';
|
|
});
|
|
tableInnerHTML += '</tr><thead><tbody>';
|
|
} else {
|
|
tableInnerHTML += '<tr>';
|
|
Array.from(tableBody.rows[i].children).forEach((td) => {
|
|
tableInnerHTML = tableInnerHTML + '<td>' + td.children[0].children[0].innerHTML + '</td>';
|
|
});
|
|
tableInnerHTML += '</tr>';
|
|
}
|
|
i++;
|
|
}
|
|
tableInnerHTML += '</tbody>';
|
|
}
|
|
|
|
if (getExplorer() !== 'Safari' && name.substr(-1, 4) !== '.xls') {
|
|
name += '.xls';
|
|
}
|
|
|
|
if (getExplorer() == 'ie') {
|
|
var curTbl = table;
|
|
var oXL = new ActiveXObject('Excel.Application');
|
|
var oWB = oXL.Workbooks.Add();
|
|
var xlsheet = oWB.Worksheets(1);
|
|
var sel = document.body.createTextRange();
|
|
sel.moveToElementText(curTbl);
|
|
sel.select();
|
|
sel.execCommand('Copy');
|
|
xlsheet.Paste();
|
|
oXL.Visible = true;
|
|
|
|
try {
|
|
var fname = oXL.Application.GetSaveAsFilename('Excel.xls', 'Excel Spreadsheets (*.xls), *.xls');
|
|
} catch (e) {
|
|
print('Nested catch caught ' + e);
|
|
} finally {
|
|
oWB.SaveAs(fname);
|
|
// oWB.Close(savechanges = false);
|
|
oXL.Quit();
|
|
oXL = null;
|
|
idTmr = setInterval(Cleanup(), 1);
|
|
}
|
|
} else {
|
|
tableToExcel(tableInnerHTML, aId, name);
|
|
}
|
|
}
|
|
function Cleanup () {
|
|
window.clearInterval(idTmr);
|
|
// CollectGarbage();
|
|
}
|
|
let tableToExcel = (function () {
|
|
let uri = 'data:application/vnd.ms-excel;base64,';
|
|
let template = '<html><head><meta charset="UTF-8"></head><body><table>{table}</table></body></html>';
|
|
let base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))); };
|
|
let format = function (s, c) {
|
|
return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; });
|
|
};
|
|
return function (table, aId, name) {
|
|
let ctx = {worksheet: name || 'Worksheet', table: table};
|
|
document.getElementById(aId).href = uri + base64(format(template, ctx));
|
|
document.getElementById(aId).download = name;
|
|
document.getElementById(aId).click();
|
|
};
|
|
})();
|
|
|
|
const table2excel = {};
|
|
|
|
table2excel.transform = tranform;
|
|
|
|
export default table2excel;
|