node表格模块exceljs介绍1--基本使用

前言

  • 用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]);
    }

即可。
更多资料参阅官方文档
如有问题可留言,互相交流解决。

弱鸡全栈攻城狮

2k 声望
4.6k 粉丝
0 条评论
推荐阅读
复杂场景下的h5与小程序通信
在套壳小程序盛行的当下, h5调用小程序能力来打破业务边界已成为家常便饭,h5与小程序的结合,极大地拓展了h5的能力边界,丰富了h5的功能。使许多以往纯h5只能想想或者实现难度极大的功能变得轻松简单。但在套壳...

懒懒的技术宅16阅读 3k评论 5

安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城31阅读 7.2k评论 5

封面图
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...

chokcoco20阅读 2k评论 2

在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...

边城17阅读 1.9k

封面图
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!

SegmentFault思否20阅读 5.6k评论 10

封面图
过滤/筛选树节点
又是树,是我跟树杠上了吗?—— 不,是树的问题太多了!🔗 相关文章推荐:使用递归遍历并转换树形数据(以 TypeScript 为例)从列表生成树 (JavaScript/TypeScript) 过滤和筛选是一个意思,都是 filter。对于列表来...

边城18阅读 7.6k评论 3

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 19.8k评论 9

弱鸡全栈攻城狮

2k 声望
4.6k 粉丝
宣传栏