历史版本3 :增强公式编辑器插件 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

前言编辑

FineReport中使用公式的时候,都是采用结构化的公式组合,即使是做逻辑判断,也需要采用IF等逻辑判断公式,无形中增加了公式的复杂度。

解决方案编辑

在V9.0版本中,我们提供了更灵活的公式使用方式,通过使用插件,可以自己选择使用常规公式,也可以选择使用脚本公式。

插件下载地址:https://market.fanruan.com/660插件暂未审核通过,敬请期待

该插件推荐用于2017年12月20日之后的9.0版本,之前的版本虽然也能用,但是存在一些界面使用上的BUG。

增强公式编辑器视图

先来看一看安装了增强公式编辑器后的公式编辑界面视图,如下图所示:
222
除了可以支持常规公式和脚本公式外,还能提供实时计算功能,免去了每次写公式之后要知道计算结果,还得预览一次报表的烦恼。

使用教程编辑

逻辑判断函数的使用

随意的新建一张报表,在A1格子中写入公式:=RAND() * 60,该公式的含义是返回一个0到60之间的随机数。我们需要A2格子的值根据A1格子的值的不同而不同——当A1格子的值为0到10之间的时候,A2格子的值为1,在10到20之间的时候,A2格子的值为2,如此类推,在50到60之间的时候,A2格子的值为6。

为了实现这个功能,我们可以采用条件属性中的新值、也可以采用常规公式中的SWITCH函数,这两种实现我们不再多说,添加条件属性肯定是很麻烦的,用SWITCH函数要稍微好些。

我们用脚本公式可以比较简洁的方式来实现,在A2格子中增加一个公式,切换为脚本公式,并输入内容:

var a1 = number('${A1}'); if (a1 >= 0 && a1 < 10) { return 1; } else if (a1 >= 10 && a1 < 20){ return 2; } else if (a1 >= 20 && a1 < 30) { return 3; } else if (a1 >= 30 && a1 < 40) { return 4; } else if (a1 >= 40 && a1 < 50) { return 5; } else if (a1 >= 50 && a1 <= 60) { return 6; }

当然,这个示例只是为了体现使用多个if的场景,实际上这个完全是可以简化成

var a1 = number('${A1}'); return int(a1 / 10) + 1;

循环函数的使用

除了可以使用逻辑判断函数以外,脚本公式最大的优势就在于可以使用循环函数,比如遍历一个数组,过滤出需要的值。

考虑下面一种场景:

A1格子是一个随机的从1到20的数组,用公式:=range(1, rand()*20, rand() * 3)可以大致模拟,希望A2的值是A1中值大于5的数减一形成的新数组,这种情况用现有的常规公式实现就会比较麻烦,但是用脚本公式则很轻松:

var a1 = array('${A1}'); var r = []; a1.forEach(function(value, index) { if (value > 5) { r.push(value - 1); } }); return r;

辅助函数编辑

在脚本公式中,内置了3个函数,用于处理不同的数值类型:

函数名  作用   调用方式 
  int  将参数转换为整数  var x = int('${A2}');
  number  将参数转换为浮点数  var y = number('${A3}');
array    将参数转换为数组  var z = var x = array('${A4}');

实时计算编辑

在编辑公式的过程中,比较痛苦的就是虽然实际变量不多,但是公式的逻辑比较复杂,每次修改了公式,都得点击报表的预览,才能知道修改正确了没有。增强公式编辑器插件就为了解决这个问题而提供了实时计算的功能。

我们就以上面的循环函数使用为例子,直接点击实时计算:

222

输入变量值之后直接点击确定,可以看得到计算结果

222

语法规则编辑

公式中的脚本完全遵循ECMAScript3语法规则,支持大部分ES5语法规则,具体使用文档可以参考:http://wiki.jikexueyuan.com/project/javascript/syntax.html