2017-04-03 192 views
0

因此我使用ExcelJS来创建Excel文件。目前我正在将文件保存到磁盘。我添加到文件的数据来自API调用。将ExcelJS的输出上传到NodeJS中的Azure Blob存储中

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 
} 

从阅读天青文件,这两个最合适的方法似乎是createBlockBlobFromStream()createWriteStreamToBlockBlob(),他们似乎都希望有一个只读流(纠正我,如果我错了)。这是我卡住的地方,因为我有一个使用ExcelJS的可写入流,但是我需要一个用于Azure Blob存储的可读流。很明显,我仍然可以将文件写入磁盘;从文件创建一个可读流;然后在上传到Azure Blob存储后最后删除该文件,但这是很大的开销。我是以非常迂回的方式去谈论这个吗?

回答

0

有一个在部分Streaming XLSX Writer一个解释:

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

所以,你可以试试下面的代码片段中,没有设置filenameoptions

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); 
})) 
相关问题