2017-04-03 108 views
0

因此我使用ExcelJS來創建Excel文件。目前我正在將文件保存到磁盤。我添加到文件的數據來自API調用。將ExcelJS的輸出上傳到NodeJS中的Azure Blob存儲中

let options = { 
    filename: 'pathtofile', 
    useStyles: true, 
    useSharedStrings: true 
} 

let workbook = new Excel.stream.xlsx.WorkbookWriter(options) 
let sheet = workbook.addWorksheet('myWorksheet') 

// add some data to the file 

sheet.commit() 
workbook.commit() 

我想現在更改它,以便它上傳到Azure Blob存儲。 ExcelJS允許指定stream而不是filename來承諾。所以我決定使用Memory Streams JS,所以現在選項看起來像這樣。

let stream = new streams.WritableStream() 

let options = { 
    stream: stream, 
    useStyles: true, 
    useSharedStrings: true 
} 

從閱讀天青文件,這兩個最合適的方法似乎是createBlockBlobFromStream()createWriteStreamToBlockBlob(),他們似乎都希望有一個只讀流(糾正我,如果我錯了)。這是我卡住的地方,因爲我有一個使用ExcelJS的可寫入流,但是我需要一個用於Azure Blob存儲的可讀流。很明顯,我仍然可以將文件寫入磁盤;從文件創建一個可讀流;然後在上傳到Azure Blob存儲後最後刪除該文件,但這是很大的開銷。我是以非常迂迴的方式去談論這個嗎?

回答

0

有一個在部分Streaming XLSX Writer一個解釋:

如果在選項不指定流也不文件名,該工作簿作家將創建的XLSX工作簿的內容存儲在存儲器中的streambuf對象。此StreamBuf對象可以通過屬性workbook.stream訪問,可以用來直接通過stream.read()訪問字節,或者將內容通過管道傳輸到另一個流。

所以,你可以試試下面的代碼片段中,沒有設置filenameoptions

let blobSvc = azure.createBlobService(); 

let options = { 
    useStyles: true, 
    useSharedStrings: true 
} 

let workbook = new Excel.stream.xlsx.WorkbookWriter(options) 
let sheet = workbook.addWorksheet('myWorksheet') 
sheet.columns = [ 
    { header: 'Id', key: 'id', width: 10 }, 
    { header: 'Name', key: 'name', width: 32 }, 
    { header: 'D.O.B.', key: 'DOB', width: 10, outlineLevel: 1 } 
]; 
sheet.commit() 
workbook.commit() 
workbook.stream.pipe(blobSvc.createWriteStreamToBlockBlob('mycontainer','test.xlsx',function(err,result){ 
    if(err)console.log(err) 
    console.log(result); 
})) 
相關問題