ExcelJS的writeBuffer不返回Buffer类型

Tra*_*Son 6 buffer node.js arraybuffer exceljs

我在我的项目中使用exceljs和 Typescript。但writeBuffer()函数返回ExcelJS.Buffer而不是Buffer类型。并且由于ExcelJS.Buffer继承自ArrayBuffer,转换ArrayBufferBuffer将破坏 Excel 文件。有人有解决这个问题的办法吗?提前致谢!

declare interface Buffer extends ArrayBuffer { }
Run Code Online (Sandbox Code Playgroud)
let resultExcel: Buffer; // buffer
const tmpResultExcel: ExcelJS.Buffer = await tmpWorkBook.xlsx.writeBuffer(); // arraybuffer
resultExcel = Buffer.from(tmpResultExcel); // doesn't work well
Run Code Online (Sandbox Code Playgroud)

Fré*_*ang 5

tmpWorkBook.xlsx.writeBuffer();实际上,在我看来,问题来自于错误的返回类型定义。

如果你尝试Buffer.isBuffer(tmpResultExcel),你会发现那tmpResultExcel是一个实际的 JavaScript 缓冲区。

您可以使用以下方法解决类型问题

const tmpResultExcel: any = await tmpWorkBook.xlsx.writeBuffer();
Run Code Online (Sandbox Code Playgroud)

您可以在代码中使用 tmpResultExcel 作为缓冲区。


小智 5

我也遇到过这个,这是 2022 年 exceljs 的最新版本(撰写本文时为 4.3.0)。

\n

正如 @Fr\xc3\xa9d\xc3\xa9ric Lang 所说,这确实是一个打字问题。此外,即使检查提供的类型并没有得出明确的解决方案,因为workbook.xlsx.writeBuffer()函数的签名告诉我们它返回一个普通的Buffer.

\n

您可能只想将其“转换”为exceljs.Buffer正确的.anyBufferawait

\n
private async writeXlsxBuffer(data: BillingSummaryFileLine[]): Promise<Buffer> {\n        const workbook = new exceljs.Workbook();\n        await workbook.xlsx.readFile("my_model.xlsx");\n        ...\n        return await workbook.xlsx.writeBuffer() as Buffer;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

你必须确保这实际上是一个Buffer,因为使用as关键字 Typescript 会假设你知道你在做什么,将一个对象转换为另一种类型。

\n