使用SheetJS/js xlsx读取大型Excel文件



我正在使用这个包:https://www.npmjs.com/package/xlsx

然而,我可以有一些非常大的excel文件,可以包含100万行。

我测试了600K行,这大约是15mb的excel文件,我的代码已经在localhost上崩溃了。

有没有别的东西可以流进来?我知道文档中说他们没有任何流式api,但它谈到了缓冲?

var reader = new FileReader();
reader.onload = evt => {
const bstr = evt.target.result;
const wb = XLSX.read(bstr, { type: "binary" });
const wsname = wb.SheetNames[0];
const ws = wb.Sheets[wsname];
const data = XLSX.utils.sheet_to_json(ws, { header: "A", defval: "" });
});
};
reader.readAsBinaryString(this.file);

当我不得不从一个非常大的excel文件(约50 mb(中读取数据时,我在后端使用excel Interop将其转换为csv,这比从excel文件中获取数据所需的时间更短。然后,只需通过流读取器获取前n行。这将为您提供预览所需的数据。将其发送到前端进行预览。这就是我要做的。

SheetJS文档建议使用web Worker处理大型数据集

来源:https://docs.sheetjs.com/docs/demos/bigdata/worker

解析和编写大型电子表格需要时间。在该过程中,如果SheetJS库在web浏览器中运行,则网站可能冻结

工人们提供了一种减轻繁重工作负担的方法,使网站在处理过程中不会冻结。工作仍在进行本地。没有数据发送到远程服务器。

将您的代码移动到网络工作者中

worker.js

/* this callback will run once the main context sends a message */
self.addEventListener('message', (e) => {
var reader = new FileReader();
reader.onload = evt => {
const bstr = evt.target.result;
const wb = XLSX.read(bstr, {type: "binary"});
const wsname = wb.SheetNames[0];
const ws = wb.Sheets[wsname];
const data = XLSX.utils.sheet_to_json(ws, {header: "A", defval: ""});

/* Pass the result data back */
postMessage(data);
}
}, false);

从主文件控制工人

main.js

const worker = new Worker("./worker.js");
const data = {
test: '1'
}
worker.onmessage = (response) => {
/* response recieved from worker */
console.log(response)
};
/* post a message to the worker */
worker.postMessage(data);

尝试使用流读取器

var fs = require('fs');
var XLSX = require('xlsx');
function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{
var buffers = [];
stream.on('data', function(data) { buffers.push(data); });
stream.on('end', function() {
var buffer = Buffer.concat(buffers);
var workbook = XLSX.read(buffer, {type:"buffer"});
/* DO SOMETHING WITH workbook IN THE CALLBACK */
cb(workbook);

最新更新