Як створити файл Excel за допомогою Nodejs?


86

Я програміст nodejs. Тепер у мене є таблиця даних, яку я хочу зберегти у форматі файлу Excel. Як я можу це зробити?

Я знайшов кілька бібліотек Node. Але більшість із них є синтаксичними аналізаторами Excel, а не програмами для писання Excel. Отже, потрібно щось, що може працювати на Linux. Будь ласка, повідомте мене, чи є якісь корисні бібліотеки, про які ви знаєте.

Або є спосіб, яким я можу перетворити файл CSV у файл xls (програмно)?

Відповіді:


101

excel4node - це підтримуваний власний творець файлів Excel, побудований на основі офіційної специфікації . Це схоже на, але більш підтримується, ніж 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');

Ще не пробували, але виглядайте багатообіцяюче! Дякую
Goon Nguyen

Привіт, mikemaccana, де мені використовувати цей код. чи потрібно мені використовувати цей код у контролері або будь-якому коді схеми. Ви можете відповісти на це питання: stackoverflow.com/questions/44369082 / ...
Vinoth

Я отримую помилку Помилка: Не вдається знайти модуль 'excel4node', і встановив його за допомогою npm install перед використанням
Raz

1
@raz Ви повинні поставити це запитання.
mikemaccana

@mikemaccana чи існує якийсь можливий спосіб експортувати список масивів.
Vinoth

51

Я просто придумав простий вихід. Це працює -

Просто створіть файл із вкладками як роздільниками (подібно до CSV, але замініть кому на Tab). Збережіть його з розширенням .XLS. Файл можна відкрити в Excel.

Код для довідки -

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

Це створює файл у форматі XLS. Це не працює, якщо ви спробуєте XLSX замість XLS.


4
Чому б не використовувати коми і не створити файл CSV з вузлом, а потім імпортувати його в Excel? Таким чином Excel може зробити своє і правильно створити файл xls / xlsx.
BrandonKowalski

1
Ах, зрозуміло. Акуратне виправлення ви знайшли.
BrandonKowalski

1
Для того , щоб також підтримувати спеціальні символи, я зробив просту обгортку з ох-Csv github.com/SimpliField/oh-csv#excel-compatible-csv см stackoverflow.com/questions/6588068 / ...
nfroidure

7
"Це створює файл у форматі XLS." Ні, це не так. Це як і раніше файл CSV і не здатний виконувати надзвичайні речі, наприклад, кілька робочих аркушів.
mikemaccana

5
Це взагалі не відповідає на запитання, оскільки це не файл Excel.
Даррін Хоскінг,

23

Використовуйте msexcel-builder . Встановіть його за допомогою:

npm install msexcel-builder

Тоді:

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

3
Чи можу я передати файл результату до об'єкта Response замість того, щоб зберегти його на диск?
lvarayut

звичайно, спробуйте запит npm.
Hesham Yassin

3
Це відмінна відповідь (на відміну від поточної позначеної відповіді, яка взагалі не створює файл Excel), але mxexcel-builderпротягом чотирьох років не оновлювалась. Я додав відповідь, використовуючи excel4nodeнижче.
mikemaccana

Привіт Hesham Ясін, ви можете відповісти на це питання: stackoverflow.com/questions/44369082 / ...
Vinoth

Я отримую це попередження в консолі, коли запускаю їх зразок коду з npm:(node:11702) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.
Метью Джон

12

Вам слід перевірити ExcelJS

Працює з форматами CSV та XLSX.

Чудово підходить для читання / запису потоків XLSX. Я використовував його для потокового завантаження XLSX до об’єкта відповіді Express, в основному так:

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

Працює чудово для великих файлів, працює набагато краще, ніж excel4node (отримав величезне використання пам'яті та процес виходу з пам'яті Node через майже 5 хвилин для файлу, що містить 4 мільйони комірок на 20 аркушах), оскільки можливості потокового передавання набагато обмеженіші ( не дозволяє "фіксувати ()" дані для отримання фрагментів, як тільки їх можна створити)

Дивіться також цю відповідь SO .


8

XLSx в новому офісі - це просто колекція XML та інших файлів. Таким чином, ви можете створити це і відповідно заархівувати його.

Бонус: ви можете створити дуже гарний шаблон зі стилями тощо:

  1. Створіть шаблон у "вашій улюбленій програмі електронних таблиць"
  2. Збережіть його як ODS або XLSx
  3. Розпакуйте вміст
  4. Використовуйте його як основу та заповнюйте content.xml(або xl/worksheets/sheet1.xml) своїми даними
  5. Перед подачею все це застібніть на блискавці

Однак я знайшов ODS (openoffice) набагато доступнішим (Excel все ще може його відкрити), ось що я знайшов у 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>

1
Вивчення OOXML є нетривіальним завданням. Також використання іншого формату файлу не є відповіддю на запитання - це було б краще як коментар.
mikemaccana

6

Використовуючи пакет fs, ми можемо створити файл excel / CSV з даних JSON.

Крок 1: Зберігайте дані JSON у змінній (тут вона знаходиться у змінній jsn ).

Крок 2: Створіть порожню змінну рядка (тут це дані ).

Крок 3: Додайте кожну властивість jsn до рядкових змінних даних, одночасно додаючи проміжні'\t' 2 клітинки та \ \ n після завершення рядка.

Код :

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

Вихідні дані


1
Хіба це не просто копія однієї з відповідей?
geeky_monster

Ймовірно, я розширив попередню відповідь.
Nilesh Pawar

6

Незважаючи на те, що це запитання має декілька відповідей, зараз вони можуть бути трохи застарілими.

Нові читачі можуть віддати перевагу розгляду пакета xlsx або "sheetsJS" , який зараз, здається, є найпопулярнішим пакетом вузлів для цього випадку використання.

Поточна відповідь рекомендує excel4node, який виглядає цілком непогано, але останній пакет здається менш підтримуваним (і набагато менш популярним), ніж перший.

Відповідаючи на запитання безпосередньо, використовуючи 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');

4

Або - спирайтеся на відповідь @Jamaica Geek, використовуючи Express - щоб уникнути збереження та читання файлу:

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

4
На жаль, це не дуже гарна ідея. ваші дані, ймовірно, порушать такий наївний код: Проблеми, з якими ви зіткнетесь, використовуючи вищезазначений метод: 1. розбиті стовпці, коли ваші комірки містять символ лапки або новий рядок; та 2. проблеми з кодуванням під час імпорту до Excel на Mac (ви повинні включити правильний BOM decodeURIComponent ("% EF% BB% BF") і кодувати за допомогою UTF16LE. Я рекомендую використовувати відповідну бібліотеку
Maciej Jankowski

3

встановити exceljs

npm i exceljs --save

імпортувати

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

створити книгу

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

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

після створення робочого аркуша

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

у масиві worksheet.column ви передаєте ім'я стовпця в заголовок, а ключ масиву - в ключ

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

            ];

після використання циклу forEach додайте рядок по черзі у файл exel

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

Ви також можете виконати петлю на кожному рядку та комірці заслання

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

1

Використовуйте бібліотеку exceljs для створення та запису на наявні аркуші Excel.

Ви можете переглянути цей посібник для детального пояснення.

посилання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.