节点:尝试流式传输 Excel 文件并将缓冲区传递给“xlsx”库

LPG*_*LPG 4 javascript excel xlsx node.js

我正在使用 node.js 包“xlsx”来读取 Excel 文件。从文件系统同步读取文件工作正常,但流式传输有点棘手。(该文件是远程提供的,我只能以流的形式接收它。)本地流文件会产生相同的问题,因此很容易重现。

我遵循了这里的示例: https: //www.npmjs.com/package/xlsx,但根据方法得到“已达到数据结尾”或“不受支持的文件”。

const XLSX = require('xlsx');
const fs = require('fs');

const stream = fs.createReadStream('sample.xlsx');


// This function returns Error: Unsupported file 48

documentedExample = function(){
  var arr = new Array();

  stream.on('data', function( arraybuffer ){
    var data = new Uint8Array(arraybuffer);
    for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
  });
  stream.on('end', function(){
    var bstr = arr.join("");
    var workbook = XLSX.read(bstr, {type:"binary"});

  });
}


// This function returns Error: End of data reached (data length = 75589, asked index = 77632). Corrupted zip ?

alternateExample = function(){
  var bufferArray = [];
  stream.on('data', function( thisChunk ){
    bufferArray.push( thisChunk );
  });
  stream.on('end', function(){
    var excelDataBuffer = bufferArray.join("");
    excelDataBuffer = excelDataBuffer.toString();
    var workbook = XLSX.read(excelDataBuffer, {type:"binary"});
  });
}
Run Code Online (Sandbox Code Playgroud)

重新组装 xlsx 二进制文件以供本地使用的正确方法是什么?

Kir*_*tin 6

当前图书馆不支持流读取

\n

从他们的文档中:

\n
\n

流式读取注意事项

\n

最常见和最有趣的格式(XLS、XLSX/M、XLSB、ODS)最终是 ZIP 或 CFB 文件容器。这两种格式都不将目录结构放在文件的开头:ZIP 文件将中央目录记录放在逻辑文件的末尾,而 CFB 文件可以将 FAT 结构放在文件中的任何位置!因此,为了正确处理这些格式,流函数必须在开始之前缓冲整个文件。这违背了流式传输的期望,因此我们不提供任何流式读取 API。如果你真的想要流式传输,有像 concat-stream 这样的节点模块可以为你做缓冲。

\n
\n

xlsx包中有一些用于在流中写入的内容:

\n
\n

XLSX.stream 对象中提供了流式写入功能。它们采用与普通写入函数相同的参数,但返回一个可读流。它们仅在节点中公开。

\n

XLSX.stream.to_csv 是 XLSX.utils.sheet_to_csv 的流版本。

\n

XLSX.stream.to_html 是 XLSX.utils.sheet_to_html 的流版本。

\n
\n

我已经写信支持询问 do Pro版是否有它并收到了这个答案:

\n
\n

XLSX 中使用的 zip 格式会阻止真正的流读取(您必须读取到文件末尾才能找出所有子文件的位置)。我不会\xe2\x80\x99t使用https://github.com/thejoshwolfe/yauzl#no-streaming-unzip-api的极端语言但我同意核心信息:

\n

任何提供流式解压缩 API 的库要么是不诚实的,要么是不合格的(通常是后者)。

\n

我们提供基于事件的阅读,这会跳过构建完整的工作簿对象。您收到行对象,这可以最大限度地减少内存压力。

\n

在写入方面,我们提供基于流的 XLSX 写入以及 SpreadsheetML 和其他格式。

\n
\n

就我而言,我不得不重写一切=(

\n