Node.js 从谷歌云存储读取Excel文件
我正在尝试读取一个从应用程序引擎上运行的Nodejs应用程序上传到谷歌存储的电子表格 Nodejs中@google cloud/storage package提供的函数是createReadStream()。我正在将此流传递给Exceljs对象 代码如下:Node.js 从谷歌云存储读取Excel文件,node.js,google-app-engine,google-cloud-platform,google-cloud-storage,exceljs,Node.js,Google App Engine,Google Cloud Platform,Google Cloud Storage,Exceljs,我正在尝试读取一个从应用程序引擎上运行的Nodejs应用程序上传到谷歌存储的电子表格 Nodejs中@google cloud/storage package提供的函数是createReadStream()。我正在将此流传递给Exceljs对象 代码如下: const blob = bucket.file(req.file.originalname); const blobStream = blob.createWriteStream(); blobStream.on('finish', ()
const blob = bucket.file(req.file.originalname);
const blobStream = blob.createWriteStream();
blobStream.on('finish', () => {
let readStream = storage.bucket(bucket.name).file(blob.name).createReadStream();
let returnString = '';
const workbook = new Excel.stream.xlsx.WorkbookReader();
var options = {
entries: "emit",
sharedStrings: "cache",
worksheets: "emit"
};
workbook.read(readStream, options);
workbook.on('worksheet', function (worksheet) {
console.log("worksheet", worksheet.name);
worksheet.on('row', function (row) {
if(row.values.length > 0){
console.log(" row.values", row.values[1]);
returnString += row.values[1] + " ";
}
});
worksheet.on('close', function () {
console.log("worksheet close");
});
worksheet.on('finished', function () {
console.log("worksheet finished");
res.send(returnString);
});
});
});
blobStream.end(req.file.buffer);
workbook.read(readStream,options)是否获得正确的readStream
由于我在提到这一点时遇到以下错误:
UnhandledPromiseRejectionWarning: Error: Could not recognise input
2019-07-07 20:35:09 default[20190708t020308] at module.exports._getStream (/srv/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js:58:11)
2019-07-07 20:35:09 default[20190708t020308] at module.exports.read (/srv/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js:79:37)
2019-07-07 20:35:09 default[20190708t020308] at Pumpify.blobStream.on (/srv/app.js:80:14)
2019-07-07 20:35:09 default[20190708t020308] at Pumpify.emit (events.js:198:13)
2019-07-07 20:35:09 default[20190708t020308] at finishMaybe (/srv/node_modules/readable-stream/lib/_stream_writable.js:630:14)
2019-07-07 20:35:09 default[20190708t020308] at afterWrite (/srv/node_modules/readable-stream/lib/_stream_writable.js:492:3)
2019-07-07 20:35:09 default[20190708t020308] at onwrite (/srv/node_modules/readable-stream/lib/_stream_writable.js:483:7)
2019-07-07 20:35:09 default[20190708t020308] at Pumpify.WritableState.onwrite (/srv/node_modules/readable-stream/lib/_stream_writable.js:180:5)
2019-07-07 20:35:09 default[20190708t020308] at Object.onceWrapper (events.js:286:20)
2019-07-07 20:35:09 default[20190708t020308] at Pumpify.emit (events.js:198:13)
2019-07-07 20:35:09 default[20190708t020308] at Pumpify.Duplexify.uncork (/srv/node_modules/duplexify/index.js:77:50)
当您使用multer和云存储上传文件时,“过程”是: 您在multer的缓冲区中有一个文件,然后,使用此缓冲区,您在云存储中写入一个文件,因此您可以利用这一点,只需使用exceljs读取multer缓冲区
const Stream = require('stream'); //Stream is a node resourse
const blob = bucket.file(req.file.originalname);
const blobStream = blob.createWriteStream();
blobStream.on('finish', () => {
// ToDo when the file has uploaded in storage
})
let workbook = new Excel.Workbook();
let stream = new Stream.Readable();
stream.push(req.file.buffer); // using multer buffer
stream.push(null);
workbook.xlsx.read(stream).then((workbook)=> {
// ToDo with excel file readed
})
在这里查看exceljs代码的源代码。。。您的流似乎不是“stream.Readable”的实例。这将是我的第一次测试。。。确保您的readStream在使用时感觉良好。之前我将文件上载到云存储,然后从云函数读取,但现在我直接从缓冲区读取。