0

所以我正在使用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 允许指定 astream而不是filename要提交的 a。所以我决定使用Memory Streams JS,所以现在选项看起来像这样。

let stream = new streams.WritableStream()

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

通过阅读 Azure 文档,两种最合适的方法似乎是createBlockBlobFromStream()并且createWriteStreamToBlockBlob()它们似乎都想要一个可读流(如果我错了,请纠正我)。这是我卡住的地方,因为我有一个使用 ExcelJS 的可写流,但我需要一个用于 Azure Blob 存储的可读流。显然我仍然可以将文件写入磁盘;从文件创建一个可读流;然后在上传到 Azure Blob 存储后最终删除文件,但这是很多开销。我会以一种非常迂回的方式来解决这个问题吗?

4

1 回答 1

0

Streaming XLSX Writer部分有解释:</p>

如果选项中既没有指定流也没有指定文件名,则工作簿编写器将创建一个 StreamBuf 对象,该对象将 XLSX 工作簿的内容存储在内存中。此 StreamBuf 对象可通过属性 workbook.stream 访问,可用于通过 stream.read() 直接访问字节或将内容通过管道传输到另一个流。

因此,您可以尝试以下代码片段,而无需设置filenamein 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);
}))
于 2017-04-04T02:43:10.747 回答