2016-11-10 95 views
0

我需要一个服务下载从Amazon S3的Excel文件,然后用node-xlsx下载XLSX,并解析它

解析的问题是,我不能让XLSX来解析文件。当我尝试读回刚写入的文件时,代码找不到它。

我不太清楚,如果这是最好的方法,但是这是我到目前为止:

router.get('/process', (req, res) => { 
    var fileName = 'https://some-bucket.s3.amazonaws.com/some-excel-file.xlsx' 
    https.get(fileName, response => { 
     var body = '' 
     response.on('data', chunk => body += chunk) 
     response.on('end',() => { 

      //fs is being imported early on this file 
      fs.writeFile(__dirname + '/test.xlsx', body) 

      var f = fs.createReadStream(__dirname + '/test.xlsx') 

      var book = xlsx.parse(f) 
      book.forEach(sheet => console.log('sheet', sheet.name)) 

      res.status(200)   
     }) 
     .on('error', e => { 
      res.status(500) 
     }) 
    }) 
    return 
}) 

回答

2

这是你可以读取S3的NodeJS文件并将其保存在存储器中,而第一次将文件写入到某个位置在磁盘上。它可以与S3和AWS Lambda的组合一起使用,以便您不必将文件写入Lambda上的某个位置。

请记住,这个过程是异步的。

var params = { 
     Bucket: "", 
     Key: "" 
    }; 

    var file = s3.getObject(params).createReadStream(); 
    var buffers = []; 

    file.on('data', function (data) { 
     buffers.push(data); 
    }); 

    file.on('end', function() { 
     var buffer = Buffer.concat(buffers); 
     var workbook = xlsx.parse(buffer); 
     console.log("workbook", workbook) 
    }); 
+0

虽然这个代码片断可以解决的问题,[包括解释(http://meta.stackexchange.com/questions/114762/explaining-entirely-基于代码的-答案)确实有助于提高您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 –

+0

我更新了它告诉我你的想法谢谢指针。 –

1

node-xlsx模块需要将整个XLSX缓冲器可用。所以你不能通过ReadStream就像你现在正在做的那样。试试这个方法,它完全避免了在写入磁盘:

router.get('/process', (req, res) => { 
    var fileName = 'https://some-bucket.s3.amazonaws.com/some-excel-file.xlsx' 
    https.get(fileName, response => { 
     var chunks = [] 
     response.on('data', chunk => chunks.push(chunk)) 
     .on('end',() => { 
      var book = xlsx.parse(Buffer.concat(chunks)) 
      book.forEach(sheet => console.log('sheet', sheet.name)) 
      res.status(200)   
     }) 
     .on('error', e => { 
      res.status(500) 
     }) 
    }) 
    return 
})