excel 在NodeJS中解析/转换大型XLSX(超过600 MB)为CSV

xqkwcwgp  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(244)

我遇到了一个问题,转换大XLSX这是超过600 MB的CSV。事情是,与较小的文件(〉3 MB)它的罚款,但当谈到大文件,然后我可以看到它是如何吃掉整个内存,然后只是创建一个空的测试.csv文件。
到目前为止,我使用了以下模块:节点-xlsx
我遵循以下指南:Convert XLS to CSV on the server in Node

jmo0nnb3

jmo0nnb31#

您正在遵循的指南适用于较小的文件。然而XLSX是最著名的一个。
但是,由于节点RAM使用的限制,对于大文件也会失败。
您可以增加允许的RAM--max_old_space_size=4096,其中4096=4GB

nbysray5

nbysray52#

我的大表不工作的主要问题是我升级到node: v14.17.0 (with npm 6.14.13)后使用的是node: v7.10.1 (with npm 4.2.0),我在运行节点脚本时也使用了--max-old-space-size=4096
∮ ∮ ∮ ∮
我只是在SheetJS因为较大的工作表而没有输出数据之后才开始使用这个解决方案。我将这个解决方案与PapaParse一起使用,因为我发现它很容易使用。

const xlsx = require('node-xlsx');
const Papa = require('papaparse');
const fs = require('fs');

var obj = xlsx.parse(inputPath);

for(var i = 0; i < obj.length; i++) {
    var sheet = obj[i];
    fs.writeFile(`${outputPath}.${i}.csv`, Papa.unparse(sheet.data));
}

∮ ∮ ∮ ∮
我仍然包括这个解决方案,因为它工作得很好,直到问题与更大的表,我也喜欢它有CLI命令。
用于将excel转换为CSV的CLI命令:

xlsx --book -o 'output.csv' 'input.xlsx'

在节点中执行相同操作的代码

const XLSX = require('xlsx');

const workBook = XLSX.readFile(inputPath);
workBook.SheetNames.forEach((sheet, idx) => {
    XLSX.writeFile(workBook, `${outputPath}.${idx}.csv`, {sheet: sheet, bookType: "csv"});
});

相关问题