【问题标题】:Reading Large Excel Files with SheetJS/js-xlsx?使用 SheetJS/js-xlsx 读取大型 Excel 文件?
【发布时间】:2018-07-26 21:21:27
【问题描述】:

我正在使用这个包: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);

【问题讨论】:

  • 只需浏览打开/关闭的问题。例如this describes what issue has XLS/X。在压缩格式的情况下,整个文件必须加载到内存中。这似乎是后端工作..
  • @bigless - 我一直在解决已关闭的问题,试图找到一些解决方法。我同意这可能是一项后端工作,但我需要首先向用户显示至少 1000 条记录,以便他们可以进行一些映射,然后我需要以某种方式将其发送到 asp.net core api。
  • 您可以显示不超过限制的文件记录。还是您希望大多数文件都像 15MB 或更大?
  • 我认为大多数会小于 15MB(可能像 6mb..我还没有测试过,所以它们也可能是一个问题)。我真的只需要第一行,这将是标题列名称,因为有时人们不使用正确的名称,所以我所拥有的是如果列与预期名称不匹配,用户可以选择哪些列与我的预期匹配名字。
  • 我没有关注,我基本上只是举了一个我找到的例子并开始使用它。我的想法是从电子表格中取出 X 行作为各种预览。然后,一旦一切顺利,开始批量发送行到服务器(.net core api)并将其保存到数据库中,同时支持尽可能大的文件(否则我将不得不制作这个的 2 个版本,一个显示预览和一个文件必须是完美的,它被发送到服务器并处理它们)

标签: javascript excel streaming filereader xlsx


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尝试使用流阅读器

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

    【讨论】:

    • 嘿,你的代码好像不完整,process_RS是什么?这会被什么东西调用吗?
    • 这里的 xlsx.read 不还是一个单一的呼叫而不是一个流式呼叫吗?该代码示例将文件作为流读入,但随后似乎将其解析为单个(非流)调用,我预计该调用仍会因大文件的 OOM 错误而崩溃。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多