Excel-Export:
Verwenden Sie Streams. Im Folgenden finden Sie eine ungefähre Vorstellung davon, was getan werden könnte:
-
Verwenden Sie das Exceljs-Modul. Weil es eine Streaming-API hat, die genau auf dieses Problem abzielt.
var Excel = require('exceljs')
-
Da wir versuchen, einen Download zu initiieren. Schreiben Sie geeignete Header in die Antwort.
res.status(200); res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls'); res.setHeader('Content-type', 'application/vnd.ms-excel');
-
Erstellen Sie eine Arbeitsmappe, die von Streaming Excel Writer unterstützt wird. Der dem Writer übergebene Stream ist die Serverantwort.
var options = { stream: res, // write to server response useStyles: false, useSharedStrings: false }; var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
-
Jetzt ist der Ausgabe-Streaming-Fluss vollständig eingerichtet. Bevorzugen Sie für das Eingabe-Streaming einen DB-Treiber, der Abfrageergebnisse/Cursor als Stream ausgibt.
-
Definieren Sie eine asynchrone Funktion, die 1 Tabelle in 1 Arbeitsblatt ausgibt.
var tableToSheet = function (name, done) { var str = dbDriver.query('SELECT * FROM ' + name).stream(); var sheet = workbook.addWorksheet(name); str.on('data', function (d) { sheet.addRow(d).commit(); // format object if required }); str.on('end', function () { sheet.commit(); done(); }); str.on('error', function (err) { done(err); }); }
-
Lassen Sie uns nun einige DB-Tabellen exportieren, indem wir die mapSeries des async-Moduls verwenden:
async.mapSeries(['cars','planes','trucks'],tableToSheet,function(err){ if(err){ // log error } res.end(); })
CSV-Export:
Für den CSV-Export einer einzelnen Tabelle/Sammlung kann das Modul fast-csv verwendet werden:
// response headers as usual
res.status(200);
res.setHeader('Content-disposition', 'attachment; filename=mytable_dump.csv');
res.setHeader('Content-type', 'text/csv');
// create csv stream
var csv = require('fast-csv');
var csvStr = csv.createWriteStream({headers: true});
// open database stream
var dbStr = dbDriver.query('SELECT * from mytable').stream();
// connect the streams
dbStr.pipe(csvStr).pipe(res);
Sie streamen jetzt Daten von der DB in die HTTP-Antwort und konvertieren sie spontan in das xls/csv-Format. Es ist nicht erforderlich, die gesamten Daten im Arbeitsspeicher oder in einer Datei zu puffern oder zu speichern.