101

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

我找到了一些 Node 库。但其中大多数是 Excel 解析器而不是 Excel 编写器。我使用的是 Linux 服务器。因此需要可以在 Linux 上运行的东西。如果您知道任何有用的库,请告诉我。

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

4

11 回答 11

122

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');
于 2017-03-10T15:08:54.410 回答
57

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

只需创建一个以 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 ,它不起作用。

于 2013-07-03T14:37:04.173 回答
25

使用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');
});
于 2014-05-23T12:22:01.800 回答
19

虽然这个问题有几个答案,但它们现在可能有点过时了。

新读者可能更喜欢考虑 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');
于 2019-09-14T07:10:06.427 回答
17

你应该检查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 分钟后内存使用量巨大,节点进程“内存不足”崩溃),因为它的流媒体功能受到了更多限制(确实不允许“提交()”数据在生成块时立即检索)

另请参阅此 SO 答案

于 2017-12-08T09:43:09.137 回答
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>
于 2014-04-22T12:00:36.317 回答
8

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

第 1 步:将 JSON 数据存储在一个变量中(这里是在jsn变量中)。

第 2 步:创建空字符串变量(这里是data)。

步骤 3:将jsn的每个属性附加到字符串变量数据,同时'\t' 在完成行后附加 put in-between 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');
 });

输出

于 2017-11-02T10:31:53.677 回答
4

安装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 行和单元格上执行循环

worksheet.eachRow(function(row, rowNumber) {
    console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
});
row.eachCell(function(cell, colNumber) {
    console.log('Cell ' + colNumber + ' = ' + cell.value);
});
于 2019-04-10T05:12:33.097 回答
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);
于 2016-07-19T12:16:55.840 回答
3

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

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

关联

于 2019-12-17T13:17:48.600 回答
1

第一个参数是源文件

第二个参数是分隔符

第三个参数是生成的文件 (*.xlsx)

注意:增加节点堆使用:node --max-old-space-size=4096 index.js

const fs = require('fs');
var xl = require('excel4node');
const data = fs.readFileSync(process.argv[2], 'utf-8');
const lines = data.split(/\r?\n/);
const linesFromOne = [null].concat(lines);
var wb = new xl.Workbook();
var ws = wb.addWorksheet('Planilha 1');
for (let j=1;j<=linesFromOne.length-1;j++){             
  // Create a reusable style
  var style = wb.createStyle({
    font: {
      color: '#050000',
      size: 12,
    },

  });

    pieces = linesFromOne[j].split(process.argv[3])
    pieces.forEach((element, index) =>{
    ws.cell(j, index+1).string(element)
    .style(style);
    });

} 

wb.write(process.argv[4]);
于 2021-11-09T17:21:33.317 回答