最近在听一次需求宣讲会上,听业务部门的负责人对着后端同窗讲:“大家研发同窗能不能帮咱们实现一下这个功能,具体来讲就是一些地市分行汇总上来的一份Excel文件里有多个sheet表,第一个sheet表是汇总数据,其余sheet表是各分行数据,那么咱们要作的工做就是仔细校验一下各分行每一个单元格的数据相加是否等于总行出纳记录出来的数据,而后向上汇报给银监会。这个不能出一点差错,否则很麻烦,因此咱们如今都是人工核对。咱们从英国留学回来的硕士,天天就作这些工做浪费了大量时间,如今但愿能借助科技的力量省一些时间,让他去作其余更有意义的事。指望大家能帮忙校验一下这些数据,对于出错了的单元格,背景展现为红色,没出错则显示正常。”现场展现Excel文件以下⏬ 特别说明
银行对信息安全的管理十分严格,故以上数据均为伪造数据
。
后端同窗一看这个表格,表示能作是能作的,可是须要传上去的数据表头和表行不能这么复杂,须要是有规律的一行一行,一列一列的数据,像这样的他们很差作。我定睛一看,嘿!这功能前端彻底能搞啊,并且不须要那么多他们说的表头表行限制的,没准是什么样校验完就能返回什么样。“悄悄地进村,打枪的不要。”,没有确切把握的事情就不声张了,会上没发声,会下搞起了预研,并成功的实现了这个需求。html
要想实现这样一个Excel文件中的多个sheet表格的总分校验功能,原理其实很简单,核心API就是使用XLSX
的readFile()
与xlsx-style
的设置样式功能。再结合node.js的writeFile
,将其写入指定的文件中。
Excel的功能很强大,它的宏功能已经相似于程序运算了,也彻底能够实现多张sheet表的元素在一张总表sheet内相加的功能,但它毕竟只能作一些辅助运算工做,对于比较分析几万条数据而后标记样式这种主观操做单靠软件自身仍是无能为力的。还须要借助工具实现主观操做,提取里面有用的信息按照设定意图来进行分析比较,进而最终拿到预期结果。前端
xlsx
熟悉xlsx这个npm包的同窗们应该都知道,它是前端处理Excel文件的利器,目前npm官网提供的是开源社区版本,加强的pro版本须要付费。这里咱们不用须要Pro版本,把社区版弄明白就够用了。支持的输入输出格式有不少,好比csv/html/json,我就不贴官网的api了,有兴趣的本身去细看,主要记录下实现过程。踩了一些坑,也更加明白基础的重要性。node
解析文件的第一步,是去读,这涉及到获取数据源并将其导入到库中,一些常见的场景是用node.js读,或者photoshop的扩展脚本,ajax请求、浏览器拓转或者浏览器的文件上传。 这里咱们用第一种场景,使用node.js来读取文件,拿到数据源,进而进行分析校验。注意
这里读的时候使用的type是buffer,方便后面设置样式的时候写入。以前使用其余类型也能正确读出来,可是设置样式无效。ajax
const XLSX = require('xlsx');
const fs = require('fs');
const path = require('path');
const XLSXStyle = require('xlsx-style');
const wb = XLSX.readFile(path.resolve(__dirname, './test99.xls'), {type: "buffer"});
复制代码
因为表格较大,只截取部分结果以下: 从SheetNames里能够观察到,读取到了本来隐藏的sheet,而从sheets里观察到,读取到了本来隐藏或者折叠行里的数据。这里咱们并不须要关心隐藏的sheet表,只须要关注总计、分行1、分行2、分行三这四个sheet表来完成总分校验功能。 单独打印出总计表,截取部分结果以下: 这里每一个单元格数据用js来描述其实就是一个对象,v原文是raw value,意指未加工的原始数据,t指的是type,那么n就是number,意思是他是个number类型的数据,w原文是formatted text,意指格式化后的文本,f原文是 cell formula encoded as an A1-style string (if applicable),按照个人理解便是原单元格所设定的公式。好比G9单元格的f是F9/C9,指的是在原sheet表中给这个单元格设定的公式。express
根据官网文档,本段落主要讲如何去读一个具体的单元格、给Excel文件增长一个sheet表,从头开始建立一个新的工做簿。 但这都不是咱们须要的功能,笔者是遍历要校验的单元格判断总分校验是否相等便可。
这里咱们须要从C6检验到L32,因为都是伪造数据,都对应不上校验出来都是错误,故仅校验前三行(C6-L8)数据测试是否正确便可,校验代码以下: 注意点:
npm
所以须要逐个数据判断有几位小数后取整,若批量取整而后再相加就不能拿到正确的结果了。json
找到有错误的单元格后,咱们接下来就是要给其设置样式了。这里咱们用到的是xlsx-style
这个插件。 后端
设置好样式以后,咱们须要将它写入指定的Excel文件中,拿到结果。官方文档给了好多种写入的应用场景,这里咱们采用node.js写入。 api
在当前项目根目录下获取到结果文件以下: 第七行是隐藏行,比对下来均错,意料之中。C6单元格故意写错,成功检测出来。后面再分别测试了百分比单元格,小数点单元格、除不尽单元格,均能拿到预期结果,就都不一一贴出来了。至此,完成了这个总分校验功能的实现。浏览器
最核心的功能实现了,上传下载感受都是辅助功能了。若是想经过上传源文件——>比对处理后——>下载,能够经过FileSaver
来实现。具体步骤是使用express或者koa来实现一个伪后台,获取到上传的文件后进行解析,而后进行数据校验后,将文件buffer流传输给客户端浏览器,再经过FileSaver.saveAs方法来实现文件的保存。