陈卓
煤炭科学技术研究院有限公司装备分院 北京市 100013
摘要:分析目前Web报表对公式框架的需求,结合中缀表达式提出一种公式计算混合框架,阐述其定义、实现和核心算法,并就其应用前景进行介绍。
关键词:Web报表;公式计算;中缀表达式
Abstract:Analysis on demand of formula framework of current Web report system,combined with the infix expression presents a hybrid formula calculation framework,describes its definition,implementation and the core algorithm,and its application prospects were introduced.
Key words:Web Forms;Formula computing;Infix expression
1.引言
公式计算是Web报表的常见功能,一般来说,包括简单的四则运算、汇总统计等基本数学函数。通过公式计算,报表数据具有更高的逻辑准确性。目前,大多报表的公式实现均由服务器在后台负责计算生成,前台界面只进行基本的数据展现。但在填报型的报表系统中,公式计算的实时性要求较高,同时由于网络等多种因素影响,有必要在客户端先进行数据公式的计算。本文提出一种公式混合计算框架,将一部分简单公式,在客户端浏览器运行环境中进行直接计算,并结合服务器端原有报表引擎的公式计算,协作完成整个报表的公式计算,提高系统响应和用户体验。
2.相关技术介绍
2.1 Web报表
报表是通过表格、图表等格式来动态显示数据,Web报表是结合Web技术来实现报表填报、展示的解决方案。在Web报表系统中,可以连接到多种数据源,包括数据库、文件、其他应用程序等,也可以同时连接到多个数据源,轻松实现异构数据源的之间的表关联。公式计算是Web报表中对于数据逻辑处理的重要部分,通过公式计算,使得Web报表的数据之间存在有效性关联,避免数据错误录入和展示。
2.2 公式的表达式
报表公式由前项和后项组成,其中后项为需要进行实时运算的部分,通常在计算机系统中,用中缀表达式或者逆波兰表达式来表示这部分。
中缀表达式是通用的对算术、逻辑公式的表达方法,该方法将操作符以中缀的形式,处于操作数的中间。逆波兰表达式(Reverse Polish notation,RPN),是一种将运算符写在操作数之后的公式表达方式。由于计算机内存栈式结构按照先进后出的顺序,通过一次性将逆波兰表达式进行入栈操作,再逐次出栈计算,既可以计算出逆波兰表达式的值。
3.框架提出与实现
3.1 混合计算框架
为解决Web报表公式计算中,实时后台计算带来的网络高稳定性需求、用户体验较差、并发压力大等问题,本文提出一种结合JavaScript公式计算框架,并结合报表系统原有公式引擎的应用实现方案(如图1所示)。
图1 混合框架结构图
整个实现方案分为服务器端和客户端JavaScript运行环境端(以下简称前端)。服务器端在传统报表引擎对报表公式和数据处理之外,增加公式转换、输出、数据接收和公式复核功能,可基于现有报表引擎进行适配开发实现。后端与报表引擎紧密结合,实现与数据库、报表、应用系统的交互。前端需在JavaScript环境下实现公式的定义、运算、反馈等功能。
3.2 前端实现
3.2.1 公式定义
将公式定义为最直接的数学表达形式,形如 F1=F2+F3等,即由‘=’分隔为前项和后项,后项为中缀表达式形式。前项和后项中的F1、F2等对应实际的数据字段名称。表示为 ,其中,fid为单条公式的标识,具有唯一性和永久持久性,是区别不同公式的有效方式;v为赋值部分,在前端实现中,v为待计算报表数据字段的字段名称;A(f)为中缀表达式形式的预算部分。
同时,对报表中的存在的所有公式集合,在采用中缀表达式表示后,作为文本字符串存入JavaScript变量数组中,便于统一集中管理全部的公式。报表公式集合表示为 ,fx为单条公式。
3.2.2 计算触发与公式匹配
在Web报表页面中,如果用户进行了某一项数据的编辑工作,我们需要对改操作是否触发公式计算进行判断,如果该数据是公式的后项的组成部分,将需要触发公式运算。
以下为算法的简单描述:
① 通过单元格的数据变更事件,获取单元格的数据字段名称,提交到公式匹配函数。
② 根据数据字段的命名规律,定义一个数据字段名称替换的JavaScript正则表达式,在本实例中,数据字段的名称都是一个字母打头,后接长度不确定的数字,定义的正则表达式为 /(\w\d+)/g。
③ 为了识别公式中是否包含变更单元格的数据名称,需要定义一个测试是否包含该名称的正则表达式,假设匹配函数接受的数据字段名称参数为id,则定义的匹配检测正则表达式为 Eval("/" + id + ",/ig")。
④ 遍历公式集合数组,取得公式的后项,并对后项中的每个数据字段名称使用步骤2中定义的正则表达式进行替换。使用步骤3中的正则表达式进行匹配检测,如测试通过,则将源公式项放入匹配成功的公式集合。
⑤ 完成遍历后,如匹配成功的公式数组长度大于1,则将公式数组提交给公式运算模块进行公式计算。
3.2.3 公式解析
公式的解析过程是根据本实例中的数据名称规则,定义公式替换正则表达式为 /(\w\d+)/g,对公式的后项中的每个数据项进行替换,为简化代码,使用JQuery索引器,转换后的后项运算表达式形如 parseFloat(tofixed20($("#$F2").val())+ parseFloat(tofixed20($("#$F3").val())。
公式的运算过程是运行公式变换后的后项,将得到的值赋予前项。通过JQuery 索引器,我们可以直接赋予前项对应的页面上单元格。代码如下:$("#" + 前项).val(tofixed20(eval(后项运算表达式)));
3.2.4 公式链
公式链指公式的前项为另公式的组成部分,当完成前一公式的计算之后需要执行后一公式的计算。具体来说,就是某一项公式预算结果,将作为灵一项公式的输入进行计算,从而触发一连串的公式计算过程。本实例中对公式链的处理比较简单,在公式运算函数中,完成一次公式计算之后,对公式前项重新执行公式匹配的过程,如结果数组长度大于1,则继续执行公式运算的过程。
3.3 服务器端实现
将Web报表的公式进行转换处理。由于在报表系统中,公式计算采用逆波兰方式,因此,需要将公式定义方式进行转换,变成中缀表达式形式,以供前台公式计算框架使用。实际工作中,由于报表公式定义采用中缀表达式,实际上是将其转换为逆波兰形式在报表引擎中使用,而文中前端框架,可以直接获得可用的公式表示形式。
通过特定算法,可以实现表达式的相互转换,一种典型的方法是使用二叉树的转换,先中序遍历生成二叉树,再后序遍历生成逆波兰表达式(如图1所示)。
4.结语
文中结合JavaScript的特点,对基于中缀表达式的公式定义、公式匹配、触发计算环境、公式运算流程等多个环节进行了介绍和关键算法的实现,综合提出了一种在前端浏览器中,基于JavaScript进行公式计算的解决方案。目前,该方案已经在中国科学技术协会的相关财务报表填报系统中进行了实际应用,有效的解决了实际应用场景下出现的公式计算需求。在实际使用中,可以结合服务器的公式计算审核技术进行后台校验,来确保数据的有效性。
参考文献:
[1] 胡云,毛万年.一种将中缀表达式转换为后缀表达式的新方法[J].成都大学学报(自然科学版),2008,27(1):52-55.
[2] 刘政敏等.基于XML、Aja x、Web Service 技术的复杂报表生成系统[J].Computer Era.2009(3):53-56
论文作者:陈卓
论文发表刊物:《基层建设》2015年22期供稿
论文发表时间:2016/3/21
标签:公式论文; 报表论文; 表达式论文; 中缀论文; 后项论文; 数据论文; 前项论文; 《基层建设》2015年22期供稿论文;