2013-07-03 17 views
42

Jestem programistą nodejs. Teraz mam tabelę danych, którą chcę zapisać w formacie pliku Excel. Jak mam to zrobić?Jak utworzyć plik Excel z Nodejs?

Znalazłem kilka bibliotek węzłów. Ale większość z nich to Excel Pariters, a nie Excel Writers. Używam serwera Linux. Dlatego potrzebujemy czegoś, co może działać na Linuksie. Daj mi znać, jeśli znasz jakieś pomocne biblioteki.

Czy istnieje sposób przekonwertowania pliku CSV na plik xls (programowo)?

Odpowiedz

31

excel4node jest utrzymany, natywny twórca pliku Excel zbudowany z oficjalnej specyfikacji. Jest podobny do, ale bardziej utrzymany niż mxexcel-builder wymieniony w drugiej odpowiedzi.

// 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'); 
+0

Nie próbowałem jeszcze, ale spójrz obiecujące! Dzięki –

+0

Hi mikemaccana, gdzie powinienem użyć tego kodu.Czy muszę użyć tego kodu w kontrolerze lub dowolnym kodzie schematu.Możesz odpowiedzieć na to pytanie: https: //stackoverflow.com/questions/44369082/excel-download- is-not-working-in-mean-stack-app/44373532 # 44373532 – Vinoth

+0

Dziękuję. gdzie workbook.write zapisuje plik? – Raz

36

Właśnie wymyśliłem proste wyjście. To działa -

Po prostu utwórz plik z Tabulatorami jako ogranicznikami (podobnie jak w CSV, ale zastąp przecinek tabulatorem). Zapisz go z rozszerzeniem .XLS. Plik można otworzyć w Excelu.

Niektóre kod pomóc -

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

To tworzy plik w formacie XLS. Nie działa, jeśli spróbujesz XLSX zamiast XLS.

+2

Dlaczego nie używać przecinków i utworzyć plik CSV z węzłem, a następnie zaimportować go do programu Excel? W ten sposób program Excel może wykonać swoje zadanie i poprawnie utworzyć plik xls/xlsx. – BrandonKowalski

+0

Dostarczam hostowaną usługę dla klientów. Będzie wiele plików generowanych jako raporty dziennie. Nie mogę poprosić klientów, aby za każdym razem eksportowali te pliki ręcznie. –

+1

Ah gotcha. Niemniej jednak znalazłeś fajną poprawkę. – BrandonKowalski

7

XLSx w nowym pakiecie Office to spakowana kolekcja XML i innych plików. Możesz więc to wygenerować i odpowiednio skompresować.

Bonus: można stworzyć bardzo ładny szablon ze stylami i tak dalej:

  1. utworzyć szablon w „swoim ulubionym programie arkusza kalkulacyjnego”
  2. zapisać go jako ODS lub XLSX
  3. rozpakuj treści
  4. Użyj go jako bazy i wypełnić content.xml (lub xl/worksheets/sheet1.xml) z danymi
  5. Zip to wszystko przed podaniem

Jednak uważam ODS (OpenOffice) znacznie bardziej przystępny (Excel może nadal go otworzyć), oto co znalazłem w 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> 
+0

Uczenie się OOXMLa jest nietrywialnym zadaniem. Również użycie innego formatu pliku nie jest odpowiedzią na pytanie - byłoby lepiej jako komentarz: – mikemaccana

18

Zastosowanie msexcel-builder. Zainstalować go z:

npm install msexcel-builder 

wówczas:

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

Czy mogę przesłać plik wyniku do obiektu odpowiedzi, zamiast zapisać go na dysk? – lvarayut

+0

na pewno, wypróbuj żądanie npm –

+2

To jest doskonała odpowiedź (w przeciwieństwie do bieżącej zaznaczonej odpowiedzi, która w ogóle nie tworzy pliku Excel), ale 'mxexcel-builder' nie ma żadnych aktualizacji przez cztery lata .Dodałem odpowiedź za pomocą' excel4node' poniżej. – mikemaccana

2

Albo - budować na odpowiedź @Jamaica Geek, wykorzystując Express - aby uniknąć zapisywania i odczytywania pliku:

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); 
+1

Niestety to nie jest dobre pomysł. Twoje dane prawdopodobnie złamie taki naiwny kod: Problemy, które napotkasz przy użyciu powyższej metody: 1. zepsute kolumny, gdy twoje komórki zawierają znak cudzysłowu lub nową linię; oraz 2. problemy z kodowaniem podczas importowania do programu Excel na komputerze Mac (należy uwzględnić poprawny komponent dekompozycji BOM ("% EF% BB% BF") i kodować przy użyciu UTF16LE. Zalecam użycie odpowiedniej biblioteki zamiast: –

1

Korzystanie fs pakiet możemy stworzyć plik Excel/CSV z danymi JSON.

Krok 1: przechowywania danych JSON w zmiennej (tutaj jest w JSN zmiennym).

Krok 2: Utwórz pustą zmienną łańcuchową (tutaj jest data).

Etap 3: Dołącz każda własność JSN dla ciągu danych zmiennych, a dołączanie umieścić '\t' się pomiędzy 2 komórek i „\ n”, po wykonaniu szeregu.

Kod:

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

+0

Czy to tylko kopia jednej z odpowiedzi? –

+0

Prawdopodobne, że przedłużyłem poprzedni nswer. –

2

Należy sprawdzić ExcelJS

współpracuje z CSV i XLSX formatach.

Świetne do odczytywania/zapisywania strumieni XLSX. Używałem go do Stream XLSX ściągnąć do ekspresowe obiekcie odpowiedzi, w zasadzie tak:

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

Działa świetnie dla dużych plików, sprawuje się dużo lepiej niż excel4node (got użytkowaniu ogromna pamięć procesu & Node „out awarii pamięci po prawie 5 minutach dla pliku zawierającego 4 miliony komórek w 20 arkuszach), ponieważ możliwości strumieniowania są o wiele bardziej ograniczone (nie pozwala na "zatwierdzanie()" danych w celu pobrania fragmentów, gdy tylko można je wygenerować)

Zobacz także this SO answer.