用SheetJS/js-xlsx阅读大型Excel文件

whhtz7ly  于 2023-03-04  发布在  其他
关注(0)|答案(3)|浏览(445)

我正在使用此软件包:https://www.npmjs.com/package/xlsx
但是,我可以有一些非常大的excel文件,可以包含1百万行。
我测试了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);
vq8itlhq

vq8itlhq1#

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

bpzcxfmw

bpzcxfmw2#

尝试使用流读取器

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);
5jdjgkvh

5jdjgkvh3#

SheetJS docs建议使用Web工作程序处理大型数据集
来源:https://docs.sheetjs.com/docs/demos/bigdata/worker
解析和编写大型电子表格需要时间,在此过程中,如果SheetJS库在网页浏览器中运行,网站可能会冻结。
工人提供了一种减轻繁重工作的方法,这样网站在处理过程中就不会冻结。工作仍然在本地执行。没有数据发送到远程服务器。
将您的代码移到Web辅助程序中

    • 工人. 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);

从你的主文件控制工人

    • 主文件. 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);

相关问题