xlsx-populate: generating 100k rows in excel crashes the browser
Hi π I love this project !
Is it possible to stream the file, instead of inflating the browsers cash ?
I attached some code bellow
thanks a lot π
`function doExport(page, options) { return generate(page, options) .then(function (blob) { if (window.navigator && window.navigator.msSaveOrOpenBlob) { //ie window.navigator.msSaveOrOpenBlob(blob, page + β.xlsxβ); } else { //not ie var url = window.URL.createObjectURL(blob); var a = document.createElement(βaβ); document.body.appendChild(a); a.href = url; a.download = page + β.xlsxβ; a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); } }) .catch(function (err) { alert(err.message || err); throw err; }); }
function generate(page,options) { options = options || {};
options.fileName = options.fileName || page;
options.headers = BTB.pages[page].exportData.headers;
options.fields = BTB.pages[page].exportData.fields;
options.data = BTB.pages[page].exportData.rows;
options.lang = options.lang || BTB.language.get();
//prepare headers
var translatedHeaders = []
options.headers.forEach(function (item) {
var header = BTB.language.dictionary[item] ? BTB.language.dictionary[item][options.lang] : "";
translatedHeaders.push(header);
});
options.headers = [translatedHeaders];
//prepare data structure for excel
var newData = [];
var newDataLine = [];
options.data.forEach(function (item) {
newDataLine = [];
options.fields.forEach(function (field) {
var newItem = item[field] || "";
newDataLine.push(newItem);
})
newData.push(newDataLine);
});
for (var i = 0; i <= 100000; i++) {
newData.push(newData[0]);
}
options.newData = newData;
return getWorkbook(options.lang)
.then(function (workbook) {
workbook.sheet(0).range("A1:Z1").value(options.headers);
workbook.sheet(0).range("A2:Z100000").value(options.newData);
return workbook.outputAsync();//type
})
}
function getWorkbook(lang) { lang = lang || βEnβ; return new Promise(function (resolve, reject) {
var req = new XMLHttpRequest();
var url = "/templates/template" + lang + ".xlsx"; //urlInput.value;
req.open("GET", url, true);
req.responseType = "arraybuffer";
req.onreadystatechange = function () {
if (req.readyState === 4) {
if (req.status === 200) {
resolve(XlsxPopulate.fromDataAsync(req.response));
} else {
reject("Received a " + req.status + " HTTP code.");
}
}
};
req.send();
});
}`
About this issue
- Original URL
- State: closed
- Created 7 years ago
- Comments: 15 (7 by maintainers)
I just published v1.6.0 that has much better performance. In tests in V8 I was able to generate 9.5 million cells.