Wie erstelle ich eine Excel-Datei mit Nodejs?

78

Ich bin ein NodeJS-Programmierer. Jetzt habe ich eine Datentabelle, die ich im Excel-Dateiformat speichern möchte. Wie mache ich das?

Ich habe ein paar Knotenbibliotheken gefunden. Aber die meisten von ihnen sind eher Excel-Parser als Excel-Writer. Ich verwende einen Linux-Server. Benötigen Sie daher etwas, das unter Linux ausgeführt werden kann. Bitte lassen Sie mich wissen, ob es hilfreiche Bibliotheken gibt, von denen Sie wissen.

Oder gibt es eine Möglichkeit, eine CSV-Datei (programmgesteuert) in eine XLS-Datei zu konvertieren?

geeky_monster
quelle

Antworten:

97

excel4node ist ein gepflegter, nativer Excel- Dateiersteller , der aus der offiziellen Spezifikation erstellt wurde . Es ist ähnlich, aber gepflegter als der in der anderen Antwort erwähnte mxexcel-builder .

// 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');
Mikemaccana
quelle
Ich habe es noch nicht ausprobiert, sehe aber vielversprechend aus! Danke
Goon Nguyen
Hallo mikemaccana, wo soll ich diesen Code verwenden. Muss ich diesen Code im Controller oder in einem beliebigen Schema-Code verwenden? Können
Vinoth
Ich erhalte eine Fehlermeldung: Das Modul 'excel4node' wurde nicht gefunden und vor der Verwendung mit npm install installiert
Raz
1
@raz Du solltest das als Frage stellen.
Mikemaccana
@mikemaccana gibt es eine mögliche Möglichkeit, Array-Liste zu exportieren.
Vinoth
50

Ich habe nur einen einfachen Ausweg gefunden. Das funktioniert -

Erstellen Sie einfach eine Datei mit Tabulatoren als Trennzeichen (ähnlich wie bei CSV, ersetzen Sie jedoch das Komma durch Tabulatoren). Speichern Sie es mit der Erweiterung .XLS. Die Datei kann in Excel geöffnet werden.

Ein Code zur Hilfe -

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();

Dadurch wird die Datei im XLS-Dateiformat erstellt. Es funktioniert nicht, wenn Sie XLSX anstelle von XLS versuchen.

geeky_monster
quelle
4
Warum nicht Kommas verwenden und eine CSV-Datei mit Knoten erstellen und dann in Excel importieren? Auf diese Weise kann Excel seine Aufgabe erfüllen und die Datei xls / xlsx ordnungsgemäß erstellen.
BrandonKowalski
1
Ah gotcha. Ordentliche Lösung, die Sie jedoch gefunden haben.
BrandonKowalski
1
Um auch Sonderzeichen zu unterstützen, habe ich einen einfachen Wrapper mit oh-csv github.com/SimpliField/oh-csv#excel-compatible-csv erstellt, siehe stackoverflow.com/questions/6588068/…
nfroidure
7
"Dadurch wird die Datei im XLS-Dateiformat erstellt." Nein, tut es nicht. Es ist immer noch eine CSV-Datei und nicht in der Lage, hervorragende Aufgaben zu erledigen, z. B. mehrere Arbeitsblätter.
Mikemaccana
5
Dies beantwortet die Frage überhaupt nicht, da es sich nicht um eine Excel-Datei handelt.
Darryn Hosking
22

Verwenden Sie msexcel-builder . Installieren Sie es mit:

npm install msexcel-builder

Dann:

// 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');
});
Hesham Yassin
quelle
3
Kann ich die Ergebnisdatei an ein Antwortobjekt weiterleiten, anstatt sie auf einer Festplatte zu speichern?
lvarayut
sicher, versuchen Sie npm Anfrage.
Hesham Yassin
3
Dies ist eine hervorragende Antwort (im Gegensatz zu der aktuell markierten Antwort, bei der überhaupt keine Excel-Datei erstellt wird), die jedoch mxexcel-builderseit vier Jahren keine Updates mehr enthält. Ich habe eine Antwort mit excel4nodeunten hinzugefügt .
Mikemaccana
Hallo Hesham Yassin, können Sie diese Frage beantworten: stackoverflow.com/questions/44369082/…
Vinoth
Ich erhalte diese Warnung in der Konsole, wenn ihr Beispielcode von npm ausgeführt wird:(node:11702) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.
Mathew John
10

Sie sollten ExcelJS überprüfen

Funktioniert mit CSV- und XLSX-Formaten.

Ideal zum Lesen / Schreiben von XLSX-Streams. Ich habe es verwendet, um einen XLSX-Download auf ein Express-Antwortobjekt zu streamen.

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()
}

Funktioniert hervorragend für große Dateien, bietet eine viel bessere Leistung als excel4node (bei einer Datei mit 4 Millionen Zellen in 20 Blättern ist die Speicherauslastung und der Knotenprozess nach fast 5 Minuten abgestürzt ), da die Streaming-Funktionen wesentlich eingeschränkter sind erlaubt nicht, Daten "festzuschreiben ()", um Chunks abzurufen, sobald sie generiert werden können)

Siehe auch diese SO-Antwort .

Frosty Z.
quelle
8

XLSx im neuen Office ist nur eine komprimierte Sammlung von XML- und anderen Dateien. Sie können das also generieren und entsprechend komprimieren.

Bonus: Sie können eine sehr schöne Vorlage mit Stilen erstellen und so weiter:

  1. Erstellen Sie eine Vorlage in "Ihrem bevorzugten Tabellenkalkulationsprogramm".
  2. Speichern Sie es als ODS oder XLSx
  3. Entpacken Sie den Inhalt
  4. Verwenden Sie es als Basis und füllen Sie content.xml(oder xl/worksheets/sheet1.xml) mit Ihren Daten
  5. Reißverschluss vor dem Servieren

Allerdings fand ich ODS (openoffice) viel zugänglicher (Excel kann es immer noch öffnen), hier ist, was ich in gefunden habe 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>
Maciej Jankowski
quelle
1
Das Erlernen von OOXML ist keine triviale Aufgabe. Auch die Verwendung eines anderen Dateiformats ist keine Antwort auf die Frage - dies wäre besser als Kommentar.
Mikemaccana
5

Mit dem fs- Paket können wir aus JSON-Daten eine Excel / CSV-Datei erstellen.

Schritt 1: Speichern Sie JSON-Daten in einer Variablen (hier in jsn- Variable).

Schritt 2: Erstellen Sie eine leere Zeichenfolgenvariable (hier sind es Daten ).

Schritt 3: Hängen Sie jede Eigenschaft von jsn an Zeichenfolgenvariablendaten an, während Sie '\t' nach Abschluss der Zeile zwischen 2 Zellen und '\ n' einfügen .

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');
 });

Ausgabe

Nilesh Pawar
quelle
1
Ist das nicht nur eine Kopie einer der Antworten?
geeky_monster
Wahrscheinlich habe ich die vorherige Antwort erweitert.
Nilesh Pawar
4

Oder - bauen Sie mit Express auf der Antwort von @Jamaica Geek auf - um das Speichern und Lesen einer Datei zu vermeiden:

  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);
tmanolatos
quelle
4
Leider ist das keine gute Idee. Ihre Daten werden wahrscheinlich einen solchen naiven Code beschädigen: Probleme, die bei Verwendung der obigen Methode auftreten: 1. unterbrochene Spalten, wenn Ihre Zellen Anführungszeichen oder eine neue Zeile enthalten; und 2. Codierungsprobleme beim Importieren in Excel auf einem Mac (Sie müssen die korrekte Stücklistendecodierungskomponente ("% EF% BB% BF") angeben und mit UTF16LE codieren. Ich empfehle stattdessen die Verwendung einer geeigneten Bibliothek
Maciej Jankowski
4

Obwohl diese Frage mehrere Antworten hat, sind sie jetzt möglicherweise etwas veraltet.

Neue Leser ziehen es möglicherweise vor, das Paket xlsx oder "sheetJS" in Betracht zu ziehen , das nun bei weitem das beliebteste Knotenpaket für diesen Anwendungsfall zu sein scheint.

Die aktuelle Top-Antwort empfiehlt excel4node, was ziemlich gut aussieht - aber das letztere Paket scheint weniger gepflegt (und weit weniger beliebt) zu sein als das erstere.

Beantworten Sie die Frage direkt mit xlsx:

const XLSX = require('xlsx');

/* create a new blank workbook */
const wb = XLSX.utils.book_new();

// Do stuff, write data
//
//

// write the workbook object to a file
XLSX.writeFile(workbook, 'out.xlsx');
defraggliert
quelle
1

installiere exceljs

npm i exceljs --save

Exceljs importieren

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

Arbeitsmappe erstellen

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

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

nach dem Erstellen des Arbeitsblatts

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

Im Array worksheet.column übergeben Sie den Spaltennamen im Header und den Array-Schlüssel im Schlüssel

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},

            ];

Nachdem Sie die forEach-Schleife verwendet haben, fügen Sie eine Zeile nach der anderen in die Exel-Datei ein

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

Sie können auch eine Schleife für jede Exel-Zeile und -Zelle ausführen

worksheet.eachRow(function(row, rowNumber) {
    console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
});
row.eachCell(function(cell, colNumber) {
    console.log('Cell ' + colNumber + ' = ' + cell.value);
});
Rajpoot Rehan
quelle
1

Verwenden Sie die exceljs-Bibliothek zum Erstellen und Schreiben in vorhandene Excel-Tabellen.

In diesem Tutorial finden Sie detaillierte Erklärungen.

Verknüpfung

Seenu69
quelle