【问题标题】:Read data from .xlsx file on S3 using Nodejs Lambda使用 Nodejs Lambda 从 S3 上的 .xlsx 文件中读取数据
【发布时间】:2022-02-11 22:09:05
【问题描述】:

我还是 NodeJs 和 AWS 的新手,所以如果这是一个菜鸟问题,请原谅我。

我正在尝试从 excel 文件 (.xlsx) 中读取数据。 lambda函数接收文件类型的扩展名。

这是我的代码:

exports.handler = async (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    if (event.fileExt === undefined) {
        callback("400 Invalid Input");
    }
    
    let returnData = "";
    const S3 = require('aws-sdk/clients/s3');
    const s3 = new S3();
    

    switch(event.fileExt)
    {
        case "plain":
        case "txt":
            // Extract text
            const params = {Bucket: 'filestation', Key: 'MyTXT.'+event.fileExt};
            
            try {
                await s3.getObject(params, function(err, data) {
                  if (err) console.log(err, err.stack); // an error occurred
                  else{           // successful response
                      returnData = data.Body.toString('utf-8');
                      context.done(null, returnData);
                  }
                }).promise();
        
            } catch (error) {
                console.log(error);
                return;
            }  
           
            break;
        case "xls":
        case "xlsx":
            returnData = "Excel";
            // Extract text
            
            const params2 = {Bucket: 'filestation', Key: 'MyExcel.'+event.fileExt};
            const readXlsxFile = require("read-excel-file/node"); 
            
            try {     
                const doc = await s3.getObject(params2);     
                const parsedDoc = await readXlsxFile(doc);     
                console.log(parsedDoc)   
            } catch (err) {     
                console.log(err);     
                const message = `Error getting object.`;     
                console.log(message);     
                throw new Error(message);   
            } 
            
            break;
        case "docx":
            returnData = "Word doc";
            // Extract text
            break;
        default:
            callback("400 Invalid Operator");
            break;
    }
    callback(null, returnData);
};

文本文件部分有效。但是 xlsx 部分使函数超时。 我确实安装了 read-excel-file 依赖项并上传了 zip,以便我可以访问它。 但是该函数超时并显示以下消息: "errorMessage": "2020-11-02T13:06:50.948Z 120bfb48-f29c-4e3f-9507-fc88125515fd Task timed out after 3.01 seconds"

任何帮助将不胜感激!感谢您的宝贵时间。

【问题讨论】:

    标签: node.js aws-lambda xlsx


    【解决方案1】:

    使用xlsx npm 库。我们就是这样做的。

    假设文件在根项目路径下。

    const xlsx = require('xlsx');
    
    // read your excel file
    let readFile = xlsx.readFile('file_example_XLSX_5000.xlsx')
    
    // get first-sheet's name
    let sheetName = readFile.SheetNames[0];
    
    // convert sheets to JSON. Best if sheet has a headers specified.
    console.log(xlsx.utils.sheet_to_json(readFile.Sheets[sheetName]));
    

    【讨论】:

      【解决方案2】:

      我将超时更改为 20 秒,它可以正常工作。只剩下一个问题:const parsedDoc = await readXlsxFile(doc); 想要接收字符串(文件路径)而不是文件。

      【讨论】:

      • 你知道const parsedDoc = await readXlsxFile(doc)为什么这部分不起作用吗?
      【解决方案3】:

      通过使用 xlsx NPM 库解决。使用流并为其提供缓冲区。

      【讨论】:

      • 你能给出解决方案的代码sn-p吗?
      猜你喜欢
      • 2019-03-30
      • 2016-02-20
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      相关资源
      最近更新 更多