[英]Uploading output of ExcelJS to Azure Blob Storage in NodeJS
所以我正在使用ExcelJS創建一個Excel文件。 目前,我正在將文件保存到磁盤。 我要添加到文件中的數據來自API調用。
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
}
通過閱讀Azure文檔,兩個最合適的方法似乎是createBlockBlobFromStream()
和createWriteStreamToBlockBlob()
,它們似乎都想要一個可讀流(如果我錯了,請糾正我)。 這是我無法使用ExcelJS的可寫流,但是我需要Azure Blob存儲的可讀取流。 顯然,我仍然可以將文件寫入磁盤。 從文件創建可讀流; 然后在上傳到Azure Blob存儲后最終刪除文件,但這會產生很多開銷。 我要以一種真正的回旋方式來解決這個問題嗎?
Streaming XLSX Writer一節中有一個解釋:
如果在選項中未指定流或文件名,則工作簿編寫器將創建一個StreamBuf對象,該對象將XLSX工作簿的內容存儲在內存中。 可以通過屬性workbook.stream訪問此StreamBuf對象,該對象可用於通過stream.read()直接訪問字節或將內容通過管道傳輸到另一個流。
因此,您可以嘗試以下代碼段,而無需在options
設置filename
:
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);
}))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.