2016-04-12 8 views
1

私はnode.jsパッケージ 'xlsx'を使用してExcelファイルを読み込んでいます。ファイルシステムからファイルを同期的に読み取ることはうまくいきますが、ストリーミングはややこしいことです。 (ファイルはリモートから配信され、ストリームとしてしか受信できません)ローカルストリームファイルでも同じ問題が発生するため、簡単に再生できます。ノード:Excelファイルをストリームし、バッファを 'xslx'ライブラリに渡そうとしています

私はここの例を踏襲しています: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バイナリを再構成する正しい方法は何でしょうか?

答えて

0

現在libraryそのdocsから

を読み取るためのストリームをサポートしていません:ストリーミング読む

最も一般的で興味深い形式(XLS、XLSX/M、XLSB、ODSに

注意)は最終的にファイルのZIPまたはCFBのコンテナです。どちらの形式でも、ファイルの先頭にディレクトリ構造が置かれます.ZIPファイルは、中央ディレクトリレコードを論理ファイルの最後に置きますが、CFBファイルはファイルの任意の場所にFAT構造を置くことができます。その結果、これらの形式を適切に処理するには、ストリーミング関数がファイル全体をバッファリングしてから開始する必要があります。これはストリーミングの期待に賛成であるため、ストリーミング読み取りAPIは提供していません。実際にストリーミングしたい場合、バッファリングを行うconcat-streamのようなノードモジュールがあります。

somethingXLSXパッケージ内のストリームに書き込むためにあります。

ストリーミング書き込み機能はXLSX.streamオブジェクトで使用可能です。それらは通常の書き込み関数と同じ引数をとりますが、読み込み可能なストリームを返します。ノード内でのみ公開されます。

XLSX.stream.to_csvは、XLSX.utils.sheet_to_csvのストリーミングバージョンです。

XLSX.stream.to_htmlは、XLSX.utils.sheet_to_htmlのストリーミングバージョンです。あなたは最後まで読む必要があり

XLSXで使用するzip形式は、(読み真の流れを妨げる:私はそれを持っており、この答えを受け取っプロバージョンをん尋ねるサポートするために書いている

すべてのサブファイルがどこにあるかを調べるためにファイルの名前を指定します)。私はhttps://github.com/thejoshwolfe/yauzl#no-streaming-unzip-apiの過激言語を使用しませんが、コアメッセージに同意します:

ストリーミングunzip APIを提供するライブラリは、正直でも非準拠(通常は後者)でもかまいません。

我々は完全なワークブックオブジェクトを構築スキップイベントベースの読書を提供します。行オブジェクトを受け取り、メモリの負荷を最小限に抑えます。

書き込み側では、ストリームベースのXLSX書き込みとSpreadsheetMLおよびその他の形式を提供しています。

私の場合、すべてを書き直さなければならなかった=

関連する問題