如何使用Nodejs创建Excel文件?

时间:2013-07-03 14:14:08

标签: excel node.js file-io export-to-excel npm

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

我找到了一些Node库。但其中大多数是Excel Parsers而不是Excel Writers。我使用的是Linux Server。因此需要可以在Linux上运行的东西。如果您有任何有用的图书馆,请告知我们。

或者有没有办法将CSV文件转换为xls文件(以编程方式)?

10 个答案:

答案 0 :(得分:58)

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

答案 1 :(得分:39)

我只想出一个简单的方法。这有效 -

只需创建一个以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,它将无法工作。

答案 2 :(得分:20)

使用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 :(得分:8)

您应该检查 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分钟内包含4百万个单元的文件后将近5分钟崩溃)因为它的流功能更加有限(一旦可以生成就不允许“提交()”数据来检索块)

另见this SO answer

答案 4 :(得分:7)

新Office中的XLSx只是XML和其他文件的压缩集合。所以你可以生成它并相应地压缩它。

奖励:您可以使用样式等创建一个非常好的模板:

  1. 在“您最喜欢的电子表格程序”中创建模板
  2. 将其另存为ODS或XLSx
  3. 解压缩内容
  4. 将其用作 base 并使用您的数据填充content.xml(或xl/worksheets/sheet1.xml
  5. 在服务之前将其全部拉出
  6. 然而,我发现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>
    

答案 5 :(得分:5)

或者 - 使用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);

答案 6 :(得分:2)

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

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

第2步:创建空字符串变量(此处为数据)。

第3步: jsn 的每个属性附加到字符串变量数据,同时在完成2个单元格后添加<xs:complexType name="Date-Format"> <xs:annotation> <xs:documentation>DTM</xs:documentation> </xs:annotation> <xs:choice minOccurs="1"> <xs:element name="Date" type="xs:date"/> <xs:element name="DateTime" type="xs:dateTime"/> <xs:element name="Days"> <xs:annotation> <xs:documentation>To indicate a quantity of days</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:unsignedInt"> <xs:totalDigits value="3"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Weeks"> <xs:annotation> <xs:documentation>To indicate a quantity of weeks</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:unsignedInt"> <xs:totalDigits value="3"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Months"> <xs:annotation> <xs:documentation>To indicate a quantity of months</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:unsignedInt"> <xs:totalDigits value="3"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Years"> <xs:annotation> <xs:documentation>To indicate a quantity of years</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:unsignedInt"> <xs:totalDigits value="3"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:choice> </xs:complexType> 并在完成后添加'\ n'这一行。

代码

'\t'

Output

答案 7 :(得分:1)

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

新读者可能更喜欢考虑xlsx或“ sheetsJS” package,目前看来,xlsx或“ sheetsJS” Menu Dataframe在此用例中是迄今为止最受欢迎的节点包。

当前的最佳答案推荐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');

答案 8 :(得分:0)

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

答案 9 :(得分:0)

使用exceljs库创建和写入现有的Excel工作表。

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

link