Javascript 将ExcelJS的输出上载到NodeJS中的Azure Blob存储
因此,我使用创建一个Excel文件。目前我正在将文件保存到磁盘。我添加到文件中的数据来自API调用Javascript 将ExcelJS的输出上载到NodeJS中的Azure Blob存储,javascript,node.js,azure,azure-storage-blobs,exceljs,Javascript,Node.js,Azure,Azure Storage Blobs,Exceljs,因此,我使用创建一个Excel文件。目前我正在将文件保存到磁盘。我添加到文件中的数据来自API调用 let options = { filename: 'pathtofile', useStyles: true, useSharedStrings: true } let workbook = new Excel.stream.xlsx.WorkbookWriter(options) let sheet = workbook.addWorksheet('myWorksheet')
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允许指定要提交的流,而不是文件名。所以我决定使用现在的选项如下
let stream = new streams.WritableStream()
let options = {
stream: stream,
useStyles: true,
useSharedStrings: true
}
通过阅读Azure文档,两个最合适的方法似乎是createBlockBlobFromStream()
和createWriteStreamToBlockBlob()
,它们似乎都想要一个可读的流(如果我错了,请纠正我)。这就是我被卡住的地方,因为我有一个使用ExcelJS的可写流,但我需要一个用于Azure Blob存储的可读流。显然,我仍然可以将文件写入磁盘;从该文件创建可读流;然后在上传到Azure Blob存储后最终删除该文件,但这会带来很大的开销。我真的是在绕圈子吗?这一节有一个解释:
如果选项中未指定流或文件名,工作簿编写器将创建一个StreamBuf对象,该对象将在内存中存储XLSX工作簿的内容。此StreamBuf对象可通过属性workbook.stream访问,可用于通过stream.read()直接访问字节,或通过管道将内容传输到另一个流
因此,您可以尝试以下代码段,而无需在选项中设置文件名:
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);
}))