zhiqiang21 / blog

记录前端开发日常点滴。为梦想Coding...
MIT License
402 stars 44 forks source link

nodejs分析excel文件将结果写入excel文件 #28

Open zhiqiang21 opened 8 years ago

zhiqiang21 commented 8 years ago

背景

因为 Team 本身工作性质的问题,平时需要值班。值班数据可以导出为本地的Excel文件。之后需要对Excel中的结果数据做分析,并且制作图表写周报发给老大。

对于我这种对word都玩不转的人,别说用Excel中强大的公式分析数据了😓。轮到我值班的时候就用nodejs写了一个脚本自动处理Excel中的数据,并且将数据再写入Excel文件。后来分享给同事,得到了老大的夸奖,自信心爆棚 😂

之前仅仅为了满足工作的需要写的比较的随便,刚好国庆有时间按照CMD规范重写一下。然后分享给大家。

脚本目的

读取Excel文件,分析Excel中的数据,并且将结果写入Excel中。

使用的第三方包

在这个过程中使用了两个第三方的包分别如下:

require('date-utils');
var xlsx = require('node-xlsx');

使用date-utils主要是用来做一些时间上的处理。比如说时间差,当前时间向后加七天的日期。这个包非常的强大。可以看下API:

具体的API详细文档可以参考这里:点击这里

上面的两片文档可以结合着看。

<static>这些方法扩展的是Date对象,而后面的这些方法这些用于对象的实例。实例代码如下:


//当前日期推后7天的日期
var time = '2016-10-04 14:30:24'
var nextSevenDay = (new Date(time)).add({'day':7});

//比较时间差
var temp = Date.compare(time1,time2);   //结果位数值
  1. node-xlsx主要做一些excel相关的处理

比如说读取Excel 文件:

var workExcel = xlsx.parse('xxx.xls');

比如创建excel文件对象:

var buffer = xlsx.build([{name: name, data: datalist}]);

cmd规范相关内容

如果对CMD规范不熟悉的话可以参考这里

我的脚本的目录结构如下:

如果对package.json文件配置不是很熟悉的话可以参考这里

主要代码解析:

通过node-xlsx 读取的excel文件就是一个json数据。我们应该都知道一个Excel文件可以包含多张表,每张表都可以管理自己的数据。

看照上面已知内容,代码如下:

//读取某个excel文件
var chatExcel = xlsx.parse('./历史记录.xls');

//获取需要excel某个表中的数据
var tableData = excelFunc.getDataContent('历史记录', chatExcel);

//获取当前表中获取第一行数据,通常在excel中这一行就是每一列的title
var tableTitle = tableData[0];

在使用nodejs的过程中可能最大的一个迷惑就是区别exportsmodule.exports吧,它们两者的主要区别如下:

1. 简单的代码示例:

一个test1.js文件,其中代码如下:


module.exports="test";

exports.fileName = function(){
    console.log('test1');
};

在test2.js文件中使用test1.js模块的方法:

var test1 = require('test1');

test1.fileName();    //TypeError: Object test! has no method 'fileName'

2. 如果模块是一个类如有一个consoleName.js的文件,其中代码如下:

module.exports=function(name){
    this.name =name;
    this.consoleName = function(){
        console.log(this.name);
    }
}

其它模块中的调用模块的方法:

var ConsoleName = require('consoleName');
var con = new ConsoleName('zhiqiang');
con.consoleName();  //zhiqiang

3. 如果模块是一个数组,例如有一个test1.js的文件,其中的代码如下:

module.exports =['zhiqiang1','houzhiqiang'];

在其它模块的调用方法

var arr =require('test1')
console.log(arr[1])   //houzhiqiang

其它的代码就没有什么别的了,都是关于公式的存计算的问题。如果有兴趣的同学可以访问源码看一下。源码地址