这段日子一直在郑州出差搞项目,初来郑州印象感觉这里气候和武汉差不多,虽然也很热,却是没有武汉那么大的湿度,太阳光让人感觉温软且舒服,但昼夜温差还是比较大,晚上不算太热,走在大玉米楼下如意湖边吹吹湖风,让人心旷神怡。
虽然每天的生活都在忙碌单调中度过,天天加班,但是过的很充实。我们的目标始终没有变,为了尽快完成项目,大家都很努力拼命的工作,解决了一个个困难,又迎来了一个个新的挑战。同时我也给自己定了两个小目标:
1、不论再忙也要抽时间学习些新知识,每天给自己哪怕一点点积累和总结。
2、不论再忙也要抽时间锻炼,身体是革命的本钱,只有健康的体魄才能完成更艰巨的任务。
闲话扯完,接下来我们进入主题,之前公司有需求要生成基于绩效的电子版报告,于是百忙中写下这篇文章,希望对以后生成类似文档提供帮助,故分享出来给大家参考学习。由于之前是采用R语言生成的报告,对此知之甚少,因此考虑用NODE重构一个新的生成系统。以前也看过java的报表生成,比如Ireport,但是基于NODE的插件很少,也花了不少时间去查阅和比较,最终选择出比较适合我们自己的插件来完成这个事情。
要完成这个任务我们需要实现两点:
1、报告模板化,通过绑定参数动态替换原有内容,如用{name}替换医院名称。
2、图表自动生成,如果是自动生成图表需要优先考虑用模型计算绘制图形,然后才能生成图表,最终输出。
由于一个报告动辄上百页,需要进行大量图形模型绘制的计算,这样做可能会消耗大量资源,生成效率估计会降低很多。因此我另辟蹊径,通过动态截图的算法,将已经绘制完成的图形优先生成在页面中,然后用动态截取图片的形式保存输出,最终成为一个PNG格式图片导入到模板报告中,这样将大大提高生成效率。通过查阅和比较,于是找到两款适合我需要的插件,Docxtemplater和PhantomJS。
一、Docxtemplater
主要用于模板化生成报告,可以在word/pdf/ppt中加入指定参数,动态导出生成模板的工具。该工具特点是支持循环绑定,嵌套绑定方法,这样可以解决按照区域、科室等不同分类的生成问题。
安装方法:
npm install
docxtemplater(下载安装)
npm install
docxtemplater-image-module –save(下载生成图片模块)
npm install angular-expressions --save(下载json格式模块)
调用方法:
二、PhantomJS
主要用于图片动态截取,是一个基于webkit内核的无头浏览器。即没有UI界面的一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。PhantomJS提供JavaScript API接口,即通过编写js程序可以直接与webkit内核交互,在此之上可以结合Java语言等,通过Java语言调用js等相关操作。图片生成效果是所见即所得的,和我们在页面上看到的没有区别,并且它不止可以截取图片,甚至可以用它来做网络抓取。
安装方法:
npm install phantom(下载安装)
调用方法:
var page = require('webpage').create(); //实例化对象
var address = 'http://baidu.com'; //填写需要打印的HTML文件
var output = './1.png'; //存储文件路径和名称
解决方案如下:
1、将生成的json文件输出至模板文件
2、接收参数并查询页面
3、将所有生成echarts图形放在一个查询页面中,依次截图并输出
4、保留生成图片路径,并加载至模板文件中
5、导出生成文件,下载完成
遇到的问题:
1、由于系统中会存在登录验证的问题,在PhantomJS使用的时候,由于我们web系统是需要登录后使用的,这里还涉及到了一些PhantomJS的cookie自动登录的问题,只需要将cookie的key和value加入phantom脚本中,就可以实现自动登录,来请求站点下的所有资源了。
2、图片输出尽量不要过大,保持200k以内,否则也同样会产生资源消耗。
经验总结:
以上是个人一些解决方法的经验和看法,也许还有更好的解决方案,但已经可以满足开发需求。所谓条条大路通罗马,没有最好的,只有更好的,当遇到问题时候尽可能找最优解决方案,这样才能有更好的创新的产品。