繁体   English   中英

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

[英]Node: trying to stream an Excel file and pass the buffer to 'xlsx' library

我正在使用 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"});
  });
}

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

当前不支持读取流

从他们的文档

流式读取注意事项

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

有一些东西可以在xlsx包中写入流:

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

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

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

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

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

任何提供流式解压缩 API 的库[都是]不诚实或不符合规范(通常是后者)。

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

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

就我而言,我不得不重写所有内容 =(

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM