簡體   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