Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将ExcelJS的输出上载到NodeJS中的Azure Blob存储_Javascript_Node.js_Azure_Azure Storage Blobs_Exceljs - Fatal编程技术网

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

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')

因此,我使用创建一个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允许指定要提交的
流,而不是
文件名。所以我决定使用现在的选项如下

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