Ram*_*ses 5 excel node.js express
我需要一项服务来从Amazon S3下载excel文件,然后使用node-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
})
Run Code Online (Sandbox Code Playgroud)
这样就可以从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)
});
Run Code Online (Sandbox Code Playgroud)
小智 6
如果你想使用异步/等待,这里的解决方案:
const AWS = require('aws-sdk');
const XLSX = require('xlsx');
AWS.config.update({
accessKeyId: AMAZON_ACCESS_KEY,
secretAccessKey: AMAZON_SECRET_ACCESS_KEY,
});
// Get buffered file from s3
function getBufferFromS3(file, callback){
const buffers = [];
const s3 = new AWS.S3();
const stream = s3.getObject({ Bucket: 'yor_buket', Key: file}).createReadStream();
stream.on('data', data => buffers.push(data));
stream.on('end', () => callback(null, Buffer.concat(buffers)));
stream.on('error', error => callback(error));
}
// promisify read stream from s3
function getBufferFromS3Promise(file) {
return new Promise((resolve, reject) => {
getBufferFromS3(file, (error, s3buffer) => {
if (error) return reject(error);
return resolve(s3buffer);
});
});
};
// create workbook from buffer
const buffer = await getBufferFromS3Promise(file);
const workbook = XLSX.read(buffer);
// If you want to send the workbook as a download to the api end point in node
const fileName = "Categories.xlsx";
res.setHeader('Content-disposition', 'attachment; filename=' + fileName);
res.setHeader('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
const wbout = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer'});
res.send(new Buffer(wbout));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3257 次 |
最近记录: |