You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
importxlsxfrom'node-xlsx';// Or var xlsx = require('node-xlsx').default;constdata=[[1,2,3],[true,false,null,'sheetjs'],['foo','bar',newDate('2014-02-19T14:30Z'),'0.3'],['baz',null,'qux'],];varbuffer=xlsx.build([{name: 'mySheetName',data: data}]);// Returns a buffer
前言
企业项目进行数据埋点后,埋点事件名需要整理成Excel表格便于统计,目标是将下图左侧数据转化成下图右侧的Excel表格:
考虑到左侧埋点数据是随项目迭代增加的,埋点数据每增加一次我就要把数据一条一条的Ctrl+C/V复制粘贴至Excel表格内。
懒,不想这样玩,于是我写了一个自动帮我整理成表格的脚本。
脚本实现
实现流程
分成三步走
技术选型
Node.js操作Excel表格工具库有:
仅罗列以上四个。
选择的角度有以下几点:
node-xlsx最贴近以上要求,首选使用它。
node-xlsx官方生成Excel表格给出的代码块:
生成表格数据
data
是二维数组,对应表格的行列。data.length
为表格行数,data[0].length
为表格的列数;data[0][0]
对应至表格的第一行第一列的值,data[0][1]
对应至表格的第一行第二列的值。所以将埋点数据整理为一个二维数组即可,二维数组数据结构整理容易实现。
复制埋点数据
埋点数据统一放置在
buryData.js
文件,但不能随意改动它,所以将该文件单独再复制一份出来。buryData.js
buryData.js
复制出来文件命名为bury.js
,还有一个问题:bury.js
需要执行它,拿到它导出的数据对象,导出数据是使用ES6模块化语法,这边需要将ES6模块化转化成CommonJs模块化,将export default {}
替换成module.exports ={}
即可做到。Node.js fs模块+正则替换是可以达成以上目的,但为了更快捷,我选择使用工具库magic-string
magic-string它是操作字符串库,它可以帮我去掉写正则替换字符串的步骤。
生成二维数组
上文已提及,node-xlsx生成表格需要先将数据整理成二维数组。
以上数据整理成:
首先,将数据全部存放至一个
Map
对象中。因为埋点数据是一个对象,其中version1、version2
表示版本号,随项目迭代版本号会增多version3、version4……以version
进行划分Map
值。getFormatDataMap
函数执行后,返回的数据是:然后,需要知道表格最大行数,表格列数即为
map.size()
,最大行数通过获取Map.values()
获取所有的值values
,遍历values
获取values
内存放的每一个数组的长度,长度统一用另一个数组lens
临时记录,遍历结束后比较lens
中的数值得到最大的值,MAX_LEN
即为表格最大的行数,也是values
存放的所有数组中长度最大的值。最后,以
values
、MAX_LEN
进行双循环。表格列数map.size()
可获取,但为了方便直接mapValue.length
,两者是相等的。有了表格列数即可创建二维数组的第二层数组,
new Array(len).fill(' ')
第二层数组长度即为mapValue.length
,创建时数组内的值先统一填充为' '
。完成二维数组的转化,数据结构为下图:
生成表格
数据已完成,留下的就是写入数据生成表格,直接复制node-xlsx演示的代码下来。
脚本完。
完整源码:
去掉空行,一百行以内。
总结
Node.js可使用的场景非赏多,不单单是用于服务器接口的开发,我们还能通过写脚本的形式解决生活中重复性的工作,凭藉js的语法简单及强大的生态,前端不必学习shell、python等,仅使用js就可以搞定爬虫、自动化脚本等场景。
如果我的文章对你有帮助,你的👍就是对我的最大支持^_^。
The text was updated successfully, but these errors were encountered: