[英]Getting decimal from (10:10:00) while trying to load an xlsx excel file with a JavaScript library
[英]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.