2016-03-21 7 views
1

Node.js(Hapi.js)でExcellを操作するためにExcellJSライブラリを使用しています。Excelljs - ストリームからシートを作成する方法

アップロードされたファイルに基づいてワークシートを作成しました。私はこのような何かをした:

uploadItems: function (request, reply) { 
    var data = request.payload; 
    if (data.file) { 
     var name = data.file.hapi.filename; 
     //var path = __dirname + "/uploads/" + name; 
     var path = process.cwd() + "/uploads/" + name; 
     var file = fs.createWriteStream(path); 

     data.file.on('end', function (err) { 
     var workbook = new Excel.Workbook(); 
     var bulkParts = []; 
     workbook.xlsx.readFile(path) 
      .then(function (workbook) { 
       workbook.eachSheet(function (worksheet, sheetId) { 
        worksheet.eachRow({includeEmpty: true}, function (row, rowNumber) { 
         var singleItem = new _Items(data.ProductId, row.values[1], row.values[2]); 
         bulkParts.push(singleItem); 
         console.log("Row " + rowNumber + " = " + JSON.stringify(row.values)); 
        }); 
       }); 
     file.on('error', function (err) { 
      console.error(err) 
     }); 
     data.file.pipe(file); 
    } 
     ... 

これは動作します。このメソッドはstreamからファイルを作成し、このファイルを読み込んでオブジェクトを作成します。むしろストリームから直接ファイルを作成して、ディスク上の作成を避けたいと思います。エクセルプラグインの

Documentationこの言及:

// pipe from stream 
var workbook = new Excel.Workbook(); 
stream.pipe(workbook.xlsx.createInputStream()); 

をしかし、正直なところ、私は多くの方法を試みたが、ちょうどカントはそれがストリームからオブジェクトをクリートしてもらいます。 何か助けていただければ幸いです。

+0

stream.pipe(workbook.xlsx.createInputStream())。pipe(file)はどうですか? –

+0

私はしようとします、私はどのように私のブックにアクセスしますか? 'Then'は実装されていませんか? –

答えて

1

upload route is configured properlyにファイルストリームを受け入れるようにしてください。 下の例では、request.payload.fileworkbook.xlsx.readに渡すストリームです。それで、あなたは約束を処理することができます。

var uploadRoute = { 
    method: 'POST', 
    path: '/upload', 
    config: { 
     validate: { 
      payload: { 
       file: joi.any() 
      } 
     }, 
     payload: { 
      maxBytes: 30009715200, 
      output: 'stream', 
      parse: true, 
      allow: 'multipart/form-data' 
     }, 
     description: 'upload an excel file' 
    }, 
    handler: uploadRouteHandler 
}; 

function uploadRouteHandler(request, reply) { 

    if (request.payload.file) { // request.payload.file is your stream 
     var workbook = new Excel.Workbook(); 

     workbook.xlsx.read(request.payload.file) 
       .then(function(excelworkbook) { 
        /** do stuff with your new workbook here **/ 
       }); 
    } 
} 

'流れ' - 着信ペイロードがStream.Readableインターフェースを介して利用可能にされます。ペイロードが 'multipart/form-data'でparseがtrueの場合、フィールド値はテキストとして表示され、ファイルはストリームとして提供されます。 'multipart/form-data'アップロードのファイルストリームには、ファイル名とヘッダープロパティを含むプロパティhapiもあります。

+0

これはトリックをしました:) –

関連する問題