前言
- 用node做服务器端表格处理时,需要使用excel处理模块,网上能搜到的插件大概就三四种(xlsx,excel-export,node-xlsx等),经过我的使用,发现最强大,api最全面的就是exceljs。
然而因为其官方文档十分简洁(陋),初起时使用过程并不那么顺利,这里结合自己的经验,对exceljs模块及其基本用法进行简单介绍,对一些自己遇到的坑进行总结。
一、安装及引入模块
npm install exceljs
使用npm命令安装之后,在所需要的文件中引入exceljs模块:
var Excel = require('exceljs');
二、创建工作簿及工作表
- 引入之后,我们就可以直接通过js创建工作簿,注意:创建工作表之前必须创建工作簿。
var workbook = new Excel.Workbook();
- 工作簿有很多属性可以设置,比如创建人、修改时间等一般用不上的信息,一般不需要设置,如果你有特殊需要,那么请参照下述设置即可:
workbook.creator = 'WJY';
//设置创建者workbook.lastModifiedBy = 'Her';
//上次修改人workbook.created = new Date(1985, 8, 30);
//创建时间workbook.modified = new Date();
//修改时间
更多详细的关于创建工作簿的属性设置请[参考官方][1]。
- 创建工作簿之后,需要为工作簿添加工作表,用来存放我们的数据:
var sheet = workbook.addWorksheet('My Sheet');
- 通常这样创建就够了,但是也可以设置创建的工作表的属性:
// 创建标签为红色的表格
var sheet = workbook.addWorksheet('My Sheet', {properties:{tabColor:{argb:'FFC0000'}}});
// 创建网格线隐藏的表格
var sheet = workbook.addWorksheet('My Sheet', {properties: {showGridLines: false}});
// 创建第一行第一列冻结的表格
var sheet = workbook.addWorksheet('My Sheet', {views:[{xSplit: 1, ySplit:1}]});
三、表格填充(数据写入)
- 在写入数据之前,要指定使用的工作表,可以像下面这样操作:
// 通过表格名字(创建时的’My Sheet’)
var worksheet = workbook.getWorksheet('My Sheet');
// 通过表格顺序数(id),即第几张表格,这里注意,exceljs不是从0开始计算,而是1。
var worksheet = workbook.getWorksheet(1);
- 拿到工作表之后,可以通过两种方式将表格内容生成:
1.worksheet.getCell('A1').value = 'value';
这种方式较为灵活,可填写任意位置的表格,利用循环嵌套等方式可生成想要的表格。
合并单元格使用: worksheet.mergeCells('I2:J2');
此时合并了I2 J2两个单元格。
2.如果数据是对象数组data=[{name:’a’},{name:’b’},{name:’c’}],也就是数据格式良好,有固定的键值对,那么推荐这种方式:
先定好表头
worksheet.columns = [
{ header: '姓名', key: 'name', width: 10 },
];
header:参数即为在表头里出现的值,key表示这列的值对应的对象的key(本例为name),width为表格列宽。
设置表头之后,使用addrow方法即可将数据写入表中,如下:
for(let i =0;i<data.length;i++){
worksheet.addRow(data[i]);
}
四、生成xlsx文件
var filename='test.xlsx';//生成的文件名
fpath=path.join(__dirname,'../download/'+filename)//文件存放路径
workbook.xlsx.writeFile(fpath)//将workbook生成文件
.then(function() {
//文件生成成功后执行的操作,这里是将路径返回客户端,你可以有自己的操作
res.send({filePath:filename})
});
总结、
有时候我们数据格式良好,但需要实现自定义表头(表头有合并单元格、多级表头等),这时该怎么办呢?
混合使用 worksheet.mergeCells()
及worksheet.getCell().value
设置表头,之后使用
worksheet.columns = [
{ key: 'name', width: 10 },
];
注意:这里没有header的key,如果有,将会覆盖我们的自定义表头内容。
后续正常调用
for(let i =0;i<data.length;i++){
worksheet.addRow(data[i]);
}
即可。
更多资料参阅官方文档
如有问题可留言,互相交流解决。