从s3读取csv文件到ExcelJS工作簿



我想在我的aws lambda中使用exceljs库保存在s3中的csv文件上做一些操作。我无法用aws-sdk返回的响应初始化exceljs工作簿对象。正如我下面解释的,问题主要是sdk提供了MDN形式的流,而exceljs需要nodejs类型的流。

sdk响应如下
const data: GetObjectCommandOutput = await s3Client.send(command)

data.BodySdkStream<Readable | ReadableStream<any> | Blob | undefined> | undefined型这里的ReadableStream<any>是MDN类型的流。

我尝试创建这样的nodejs流(现在忽略null检查)const readableStream: ReadableStream = data.Body!.transformToWebStream();

const expectedNodejsStream = new Readable().wrap(readableStream);

但似乎这里的问题是wrap适用于NodeJS.ReadableStream .

我也尝试过这个建议在许多答案

const nodeStream = new stream.Writable();
(data.Body!as Readable).pipe(nodeStream);

但是异常被作为数据抛出。在运行时,主体不会被类型转换为可读。

Exceljs构造函数如下所示

const wb = new Excel.Workbook();
wb.xlsx.read(nodeStream);//doesnt work

或者像这样

new Excel.stream.xlsx.WorkbookReader(data.Body!.transformToWebStream());//does not work

是否有可能从sdk响应数据创建excel工作簿,而不必将MDN流转换为nodejs流?如果没有,有没有一种方法可以在不实现我们自己的流的情况下完成这种转换,就像这个答案中建议的那样

aws-sdk/client-s3 v^3.121
aws-sdk v2.1158

data.Body可以被类型转换为Buffer,这是一个nodejs结构。我们可以从这个缓冲区创建一个nodejs可读流。

const data = await s3Client2.getObject(bucketParams).promise();
console.log(`data: GetObjectCommandOutput`);
const dataBuffer = Buffer.from(data.Body as Buffer);
const wb = new Excel.Workbook();
wb.csv.read(Readable.from(dataBuffer));

相关内容

  • 没有找到相关文章

最新更新