所以我使用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存储后最终删除该文件,但这是一个很大的开销。我是以一种非常迂回的方式来做这件事的吗?
答案 0 :(得分:0)
Streaming XLSX Writer部分有解释:
如果选项中既未指定流也未指定文件名,则工作簿编写器将创建一个StreamBuf对象,该对象将XLSX工作簿的内容存储在内存中。这个StreamBuf对象可以通过属性workbook.stream访问,可以用来直接通过stream.read()访问字节,或者将内容传递给另一个流。
因此,您可以尝试使用以下代码段,而无需在filename
中设置options
:
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);
}))