我是一个 nodejs 程序员。现在我有一个要以 Excel 文件格式保存的数据表。我该怎么做呢?
我找到了一些 Node 库。但其中大多数是 Excel 解析器而不是 Excel 编写器。我使用的是 Linux 服务器。因此需要可以在 Linux 上运行的东西。如果您知道任何有用的库,请告诉我。
或者有没有办法可以将 CSV 文件转换为 xls 文件(以编程方式)?
我是一个 nodejs 程序员。现在我有一个要以 Excel 文件格式保存的数据表。我该怎么做呢?
我找到了一些 Node 库。但其中大多数是 Excel 解析器而不是 Excel 编写器。我使用的是 Linux 服务器。因此需要可以在 Linux 上运行的东西。如果您知道任何有用的库,请告诉我。
或者有没有办法可以将 CSV 文件转换为 xls 文件(以编程方式)?
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');
我只是想出了一个简单的方法。这有效 -
只需创建一个以 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 ,它不起作用。
使用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');
});
虽然这个问题有几个答案,但它们现在可能有点过时了。
新读者可能更喜欢考虑 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');
你应该检查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 答案。
新 Office 中的 XLSx 只是 XML 和其他文件的压缩集合。所以你可以生成它并相应地压缩它。
奖励:您可以使用样式等创建一个非常漂亮的模板:
content.xml
(或)xl/worksheets/sheet1.xml
但是我发现 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>
使用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');
});
安装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);
});
或者 - 建立在@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);
第一个参数是源文件
第二个参数是分隔符
第三个参数是生成的文件 (*.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]);