在NodeJS中将ExcelJS的输出上载到Azure Blob存储

时间:2017-04-03 16:18:57

标签: javascript node.js azure azure-storage-blobs exceljs

所以我使用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存储后最终删除该文件,但这是一个很大的开销。我是以一种非常迂回的方式来做这件事的吗?

1 个答案:

答案 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);
}))