如何使用Node.js创建Excel文件?


78

我是一个nodejs程序员。现在,我有了要以Excel File格式保存的数据表。我该怎么做呢?

我发现了一些Node库。但是大多数都是Excel解析器而不是Excel Writer。我使用的是Linux Server。因此需要一些可以在Linux上运行的工具。如果您知道有用的库,请告诉我。

还是有办法将CSV文件(以编程方式)转换为xls文件?

Answers:


97

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's

嗨mikemaccana,我应该在哪里使用此代码。我必须在控制器或任何模式代码中使用此代码吗?:你能回答这个问题stackoverflow.com/questions/44369082/...
Vinoth

我收到错误消息:找不到模块'excel4node',并在使用前通过npm install进行安装
Raz

1
@raz您应该问这个问题。
mikemaccana

@mikemaccana有任何可能的方法来导出数组列表。
Vinoth

50

我只是想出了一条简单的出路。这有效-

只需使用Tabs作为分隔符创建一个文件(类似于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
为什么不使用逗号并使用node创建CSV文件,然后将其导入Excel?这样,Excel可以执行其操作并正确创建xls / xlsx文件。
BrandonKowalski

1
哎呀 您找到的整洁解决方案。
BrandonKowalski 2013年

1
为了也支持特殊字符,我做了一个简单的包装与OH-CSV github.com/SimpliField/oh-csv#excel-compatible-csv 看到stackoverflow.com/questions/6588068/...
nfroidure

7
“这将以XLS文件格式创建文件。” 不,不是。它仍然是CSV文件,无法执行excel等功能,例如,多个工作表。
mikemaccana

5
这根本不能回答问题,因为它不是excel文件。
Darryn Hosking '18年

22

使用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 2015年

当然,请尝试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.
Mathew John

10

您应该检查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因为它的流传输能力受到更大的限制(确实如此,所以它(对于包含20个工作表的400万个单元的文件,在近5分钟后就获得了巨大的内存使用率和Node进程“内存不足”崩溃)不允许“ commit()”数据在生成后立即检索。)

另请参阅此SO答案


8

新Office中的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

5

使用 fs包,我们可以从JSON数据创建excel / CSV文件。

第1步:将JSON数据存储在变量中(此处位于jsn中变量中)。

步骤2:建立空字串变数(这里是资料)。

步骤3:jsn的每个属性附加到字符串变量数据,同时附加put'\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

4

或者-使用Express在@Jamaica Geek的答案上构建-避免保存和读取文件:

  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.在Mac上导入Excel时的编码问题(您必须包含正确的BOM解码URIComponent(“%EF%BB%BF”)并使用UTF16LE进行编码。我建议改用合适的库
Maciej Jankowski

4

尽管这个问题有几个答案,但现在可能有些过时了。

新读者可能更喜欢考虑xlsx或“ sheetsJS”软件包,对于该用例而言,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');

1

安装exceljs

npm i exceljs --save

导入exceljs

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

您还可以在每个exel行和单元格上进行perfome循环

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工作表。

您可以查看本教程以获取详细说明。

链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.