Как экспортировать большие данные JSON в файл Excel - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь экспортировать массив из 250000 объектов в файл Excel, используя node.js, но сервер каждый раз дает сбой с:

ФАТАЛЬНАЯ ОШИБКА: CALL_AND_RETRY_LAST Распределение не удалось - куча JavaScript не хватает памяти

Я всегда запускаю сервер с npm --max-old-space-size=8000 start

Это часть моего кода, где я пытаюсь сгенерировать файл Excel с помощью модуля excel4node:

// Create a new instance of a Workbook class
var wb = new xl.Workbook();

// Add Worksheets to the workbook
var ws = wb.addWorksheet('Sheet 1');


for(const [idx, request] of report.entries()) {
  let counter = 1;
  for(const [_, val] of Object.keys(request)) {
    ws.cell(idx + 1, counter).string(val);
    counter++;
  }
}

wb.write('Excel.xlsx');

Это содержимое массива report:

[
    {
        "Page URL": "http://www.example.com",
        "Request URL": "http://use.typekit.net/yse3oeo.js",
        "Domain": "typekit.net",
        "OP Tag Category": "Data Management",
        "OP Tag Name": "Adobe TypeKit",
        "Registrar Name": "Adobe Systems Incorporated",
        "Method": "GET",
        "Type": "Script",
        "mimeType": "text/javascript",
        "Status": 200,
        "Content Encoding": "gzip",
        "Encoded Data Length": 8028,
        "Action": null,
        "IP Address": "92.123.20.219",
        "Geolocation": "FR",
        "Match Regex": null,
        "Not Match Regex": null,
        "Error": null,
        "Chrome Initiator": "http://example.com",
        "Final Page URL": null,
        "Initial Page Status": null
    }
    ...250000 more objects
]

Я также пытался использовать модуль mongo-xlsx, но он не работает с той же ошибкой ...

Есть ли способ улучшить эффективность моего кода, чтобы уменьшить использование памяти? Или, может быть, есть лучшие способы сделать это?

1 Ответ

0 голосов
/ 18 октября 2018

вы можете использовать модуль узла exceljs и передавать данные

var options = {
    filename: './streamed-workbook.xlsx',
    useStyles: true,
    useSharedStrings: true
};
var workbook = new Excel.stream.xlsx.WorkbookWriter(options);

worksheet.addRow({
   id: i,
   name: theName,
   etc: someOtherDetail
}).commit();

см .: http://wiki.workassis.com/node-js-write-large-data-to-excel/

...