【问题标题】:Read Excel file from Google Cloud Storage从 Google Cloud Storage 读取 Excel 文件
【发布时间】:2019-11-17 10:42:45
【问题描述】:

我正在尝试从 App Engine 上运行的 Nodejs 应用读取上传到 Google 存储的电子表格。

Nodejs 中@google-cloud/storage 包提供的函数是createReadStream()。我将此流传递给 Exceljs 对象。

代码如下:

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)

【问题讨论】:

  • 在这里查看 exceljs 代码的来源...github.com/exceljs/exceljs/blob/master/lib/stream/xlsx/… 看来您的流不是“Stream.Readable”的实例。这将是我的第一次测试……确保您的 readStream 在使用时感觉良好。
  • 之前我将文件上传到云存储,然后从云函数中读取它,但现在我直接从缓冲区读取它。

标签: node.js google-app-engine google-cloud-platform google-cloud-storage exceljs


【解决方案1】:

当您使用 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
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2013-01-26
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多