web-dev-qa-db-fra.com

Comment créer un fichier Excel avec Nodejs?

Je suis un programmeur de noeud. Maintenant, j'ai un tableau de données que je veux sauvegarder au format de fichier Excel. Comment puis-je faire cela?

J'ai trouvé quelques bibliothèques Node. Mais la plupart d'entre elles sont des analyseurs syntaxiques Excel plutôt que des rédacteurs Excel. J'utilise un serveur Linux. y a-t-il des bibliothèques utiles que vous connaissez?.

Ou est-il possible de convertir un fichier CSV en fichier xls (par programme)?

64
geeky_monster

Excel4node est un créateur de fichiers Excel natif et mis à jour, construit à partir des spécifications officielles . C'est similaire à, mais plus maintenu que mxexcel-builder mentionné dans l'autre réponse.

// Require library
var Excel = require('Excel4node');

// Create a new instance of a Workbook class
var workbook = new Excel.Workbook();

// Add Worksheets to the workbook
var worksheet = workbook.addWorksheet('Sheet 1');
var worksheet2 = workbook.addWorksheet('Sheet 2');

// Create a reusable style
var style = workbook.createStyle({
  font: {
    color: '#FF0800',
    size: 12
  },
  numberFormat: '$#,##0.00; ($#,##0.00); -'
});

// Set value of cell A1 to 100 as a number type styled with paramaters of style
worksheet.cell(1,1).number(100).style(style);

// Set value of cell B1 to 300 as a number type styled with paramaters of style
worksheet.cell(1,2).number(200).style(style);

// Set value of cell C1 to a formula styled with paramaters of style
worksheet.cell(1,3).formula('A1 + B1').style(style);

// Set value of cell A2 to 'string' styled with paramaters of style
worksheet.cell(2,1).string('string').style(style);

// Set value of cell A3 to true as a boolean type styled with paramaters of style but with an adjustment to the font size.
worksheet.cell(3,1).bool(true).style(style).style({font: {size: 14}});

workbook.write('Excel.xlsx');
67
mikemaccana

Je viens de trouver un moyen simple de sortir. Cela marche -

Créez simplement un fichier avec des tabulations comme délimiteurs (similaire à CSV mais remplacez la virgule par Tab). Enregistrez-le avec l'extension .XLS. Le fichier peut être ouvert dans Excel.

Un code pour aider -

var fs = require('fs');
var writeStream = fs.createWriteStream("file.xls");

var header="Sl No"+"\t"+" Age"+"\t"+"Name"+"\n";
var row1 = "0"+"\t"+" 21"+"\t"+"Rob"+"\n";
var row2 = "1"+"\t"+" 22"+"\t"+"bob"+"\n";

writeStream.write(header);
writeStream.write(row1);
writeStream.write(row2);

writeStream.close();

Cela crée le fichier au format XLS. Cela ne fonctionne pas si vous essayez XLSX au lieu de XLS.

40
geeky_monster

Utilisez msexcel-builder . Installez-le avec:

npm install msexcel-builder

Ensuite:

// Create a new workbook file in current working-path 
var workbook = excelbuilder.createWorkbook('./', 'sample.xlsx')

// Create a new worksheet with 10 columns and 12 rows 
var sheet1 = workbook.createSheet('sheet1', 10, 12);

// Fill some data 
sheet1.set(1, 1, 'I am title');
for (var i = 2; i < 5; i++)
  sheet1.set(i, 1, 'test'+i);

// Save it 
workbook.save(function(ok){
  if (!ok) 
    workbook.cancel();
  else
    console.log('congratulations, your workbook created');
});
20
Hesham Yassin

Vous devriez vérifier ExcelJS

Fonctionne avec les formats CSV et XLSX.

Idéal pour lire/écrire des flux XLSX. Je l'ai utilisé pour diffuser un téléchargement XLSX vers un objet de réponse Express, comme ceci:

app.get('/some/route', function(req, res) {
  res.writeHead(200, {
    'Content-Disposition': 'attachment; filename="file.xlsx"',
    'Transfer-Encoding': 'chunked',
    'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  })
  var workbook = new Excel.stream.xlsx.WorkbookWriter({ stream: res })
  var worksheet = workbook.addWorksheet('some-worksheet')
  worksheet.addRow(['foo', 'bar']).commit()
  worksheet.commit()
  workbook.commit()
}

Fonctionne très bien pour les gros fichiers, fonctionne beaucoup mieux que Excel4node (utilise énormément de mémoire & Node process ", mémoire insuffisante "plantage après presque 5 minutes pour un fichier contenant 4 millions de cellules dans 20 feuilles) car ses capacités de transmission en continu sont beaucoup plus limitées (ne permet pas de" commit () "des données pour récupérer des morceaux dès qu’ils peuvent être générés)

Voir aussi this SO answer .

8
Frosty Z

XLSx dans le nouvel Office est simplement une collection compressée de fichiers XML et autres. Donc, vous pouvez générer cela et le compresser en conséquence.

Bonus: vous pouvez créer un très joli modèle avec des styles, etc.:

  1. Créez un modèle dans "votre tableur préféré"
  2. Enregistrez-le sous ODS ou XLSx
  3. Décompressez le contenu
  4. Utilisez-le comme base et remplissez content.xml (ou xl/worksheets/sheet1.xml) avec vos données
  5. Zip le tout avant de servir

Cependant, j'ai trouvé ODS (openoffice) beaucoup plus accessible (Excel peut toujours l'ouvrir), voici ce que j'ai trouvé dans content.xml

<table:table-row table:style-name="ro1">
    <table:table-cell office:value-type="string" table:style-name="ce1">
        <text:p>here be a1</text:p>
    </table:table-cell>
    <table:table-cell office:value-type="string" table:style-name="ce1">
        <text:p>here is b1</text:p>
    </table:table-cell>
    <table:table-cell table:number-columns-repeated="16382"/>
</table:table-row>
7
Maciej Jankowski

Ou - construisez sur la réponse de @Jamaica Geek, en utilisant Express - pour éviter de sauvegarder et de lire un fichier:

  res.attachment('file.xls');

  var header="Sl No"+"\t"+" Age"+"\t"+"Name"+"\n";
  var row1 = [0,21,'BOB'].join('\t')
  var row2 = [0,22,'bob'].join('\t');

  var c = header + row1 + row2;
  return res.send(c);
5
tmanolatos

En utilisant le package fs , nous pouvons créer un fichier Excel/CSV à partir de données JSON.

Étape 1: Stockez les données JSON dans une variable (la voici dans jsn variable).

Étape 2: Créez une variable chaîne vide (ici il s'agit de données ).

Étape 3: Ajoutez chaque propriété de jsn aux données de variable chaîne, tandis que en ajoutant put '\t' entre 2 cellules et '\ n' après avoir terminé la ligne.

Code :

var fs = require('fs');

var jsn = [{
    "name": "Nilesh",
    "school": "RDTC",
    "marks": "77"
   },{
    "name": "Sagar",
    "school": "RC",
    "marks": "99.99"
   },{
    "name": "Prashant",
    "school": "Solapur",
    "marks": "100"
 }];

var data='';
for (var i = 0; i < jsn.length; i++) {
    data=data+jsn[i].name+'\t'+jsn[i].school+'\t'+jsn[i].marks+'\n';
 }
fs.appendFile('Filename.xls', data, (err) => {
    if (err) throw err;
    console.log('File created');
 });

Output

2
Nilesh Pawar

installer exceljs

npm i exceljs --save

import exceljs

var Excel = require('exceljs');
var workbook = new Excel.Workbook();

créer un classeur

var options = {
                filename: __dirname+'/Reports/'+reportName,
                useStyles: true,
                useSharedStrings: true
            };

            var workbook = new Excel.stream.xlsx.WorkbookWriter(options);

après création de la feuille de travail

var worksheet = workbook.addWorksheet('Rate Sheet',{properties:{tabColor:{argb:'FFC0000'}}});

dans le tableau worksheet.column vous passez le nom de la colonne dans l'en-tête et la clé du tableau pass in key

worksheet.columns = [
            { header: 'column name', key: 'array key', width: 35},
            { header: 'column name', key: 'array key', width: 35},
            { header: 'column name', key: 'array key', width: 20},

            ];

après avoir utilisé la boucle forEach, ajoutez la ligne une par une dans un fichier exel

array.forEach(function(row){ worksheet.addRow(row); })

vous pouvez aussi effectuer une boucle sur chaque rangée et cellule

worksheet.eachRow(function(row, rowNumber) {
    console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
});
row.eachCell(function(cell, colNumber) {
    console.log('Cell ' + colNumber + ' = ' + cell.value);
});
0
rajpoot rehan