2017-02-28 62 views
0

我正在使用exceljs生成excel文件(使用它的流功能)。我不想將文件保存在服務器上,然後讀取並返回它,我想直接將exceljs流傳輸到hapijs中的響應。如何管exceljs流以在hapijs中回覆

function(request, reply) { 
    const options = { 
    stream: reply, // I need to somehow declare the reply stream here 
    useStyles: false, 
    useSharedStrings: true 
    }; 

    const workbook = new Excel.stream.xlsx.WorkbookWriter(options); 
    workbook.addWorksheet('Test'); 
    const worksheet = workbook.getWorksheet('Test'); 

    worksheet.columns = [{ 
    header: 'product', key: 'product' 
    }]; 

    worksheet.addRow({product: 'MyProduct'}).commit(); 
    worksheet.commit(); 
    workbook.commit(); 

這可能嗎?我無法像expressjs那樣直接將答覆傳遞給Exceljs流的選項?有什麼想法嗎?

+0

回覆可以返回一個流,但我會將exceljs邏輯封裝在您自己的流式接口中,您可以將它傳遞給hapi的回覆接口,我使用了模塊** [j](https://www.npmjs.com/package/j)**來實現這一點。看看[這個](https://github.com/circabs/xl-json)模塊來顯示你如何打包一個流,在我的例子中它是從excel轉換到json –

回答

1
var wb = new Excel.stream.xlsx.WorkbookWriter(); 
var sh = wb.addWorksheet('sheet1'); 
sh.columns = [ 
    { header: 'Name', key: 'name' }, 
    { header: 'Age', key: 'age' } 
]; 

sh.addRow(['Ben', 8]); 
sh.addRow(['Dave', 10]); 

sh.commit(); 
wb.commit() 
.then(function() { 
    var stream = wb.stream; 
    var b = stream.read(); 

    reply(b) 
    .type('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
    .header('Content-Disposition', 'attachment; filename=file.xlsx') 
    .header('Content-Length', stream.length); 
}); 
+0

只有代碼,「試試這個」的答案是灰心。請解釋爲什麼以及如何解決操作問題。 – user5226582

+0

您可以閱讀exceljs庫網站上的Streaming XLSX部分,其中解釋了那裏的使用情況 –

+0

對不起,如果我以前的評論出現粗魯。儘管您仍然可能希望包含額外的信息以改善您的答案的長期價值。 「如果目標站點無法訪問或永久脫機,請始終引用重要鏈接中最相關的部分」 - http://stackoverflow.com/help/how-to-answer。 – user5226582