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)

Most upvoted comments

I just published v1.6.0 that has much better performance. In tests in V8 I was able to generate 9.5 million cells.