Exportation Excel :
Utilisez les flux. Voici une idée approximative de ce qui pourrait être fait :
-
Utilisez le module exceljs. Parce qu'il a une API de streaming destinée à ce problème précis.
var Excel = require('exceljs')
-
Puisque nous essayons de lancer un téléchargement. Écrivez les en-têtes appropriés à la réponse.
res.status(200); res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls'); res.setHeader('Content-type', 'application/vnd.ms-excel');
-
Créez un classeur soutenu par le rédacteur Streaming Excel. Le flux donné au rédacteur est la réponse du serveur.
var options = { stream: res, // write to server response useStyles: false, useSharedStrings: false }; var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
-
Maintenant, le flux de streaming de sortie est configuré. pour le flux d'entrée, préférez un pilote de base de données qui donne les résultats de la requête/le curseur sous forme de flux.
-
Définissez une fonction asynchrone qui vide 1 table dans 1 feuille de calcul.
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); }); }
-
Maintenant, exportons quelques tables db, en utilisant mapSeries du module async :
async.mapSeries(['cars','planes','trucks'],tableToSheet,function(err){ if(err){ // log error } res.end(); })
Exportation CSV :
Pour l'exportation CSV d'un seul module de table/collection, fast-csv peut être utilisé :
// 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);
Vous diffusez maintenant des données de la base de données vers la réponse HTTP, en les convertissant au format xls/csv à la volée. Pas besoin de tamponner ou de stocker toutes les données en mémoire ou dans un fichier.