1. 概述
1.1 版本
报表服务器版本 | JAR包版本 | 增强公式编辑器插件版本 |
---|---|---|
10.0 | 2019-10-20 | V4.9 |
9.0 | 2017-10-20 | V4.7 |
1.2 问题描述
FineReport 中使用公式时,都是采用结构化公式组合,如果要做复杂逻辑判断,需要采用 IF 等逻辑判断公式嵌套组成,这将会使得公式比较复杂,容易出错。
1.3 解决方案
通过安装「增强公式编辑器插件」,模板单元格中输入公式时,新增支持自定义脚本公式。如下图所示:
在做复杂逻辑判断时,自定义脚本公式可以使得公式编写更简洁。
注:插件安装后,自定义脚本公式仅支持在单元格内使用。
2. 插件介绍
2.1 插件安装
点击下载插件:增强公式编辑器插件
设计器插件安装方法参照 设计器插件管理
服务器安装插件方法参照 服务器插件管理
注:使用了脚本公式的模板,在没有安装该插件的服务器上依然可以使用,但是无法进行编辑。
2.2 插件功能
安装了「增强公式编辑器」后的公式编辑界面,如下图所示:
1)新增支持脚本公式
2)新增实时计算功能,公式输入完毕后即可计算结果
注:插件安装后,自定义脚本公式仅支持在单元格内使用。
脚本公式中,内置了 3 个辅助函数,用于处理不同的数值类型,如下表格所示:
函数名 | 作用 | 调用方式 |
---|---|---|
int | 将参数转换为整数 | var x = int('${A2}'); |
number | 将参数转换为浮点数 | var y = number('${A3}'); |
array | 将参数转换为数组 | var z = array('${A4}'); |
3. 示例
3.1 自定义逻辑判断函数
新建模板,在A1单元格中写入公式 =RAND() * 60 返回一个 0 到 60 之间的随机数,A2 单元格值根据 A1 单元格值判定:0 <=A1<10 时,A2=1;10<=A1<20 时,A2 =2;...... 依次类推。
常规公式中 SWITCH 函数可实现此功能,下面我们用脚本公式的方式来实现上述功能,在A2单元格中增加脚本公式,内容如下:
var a1 = number('${A1}');
return int(a1 / 10) + 1;
点击保存,预览模板,效果如下图所示:
3.2 自定义循环函数
A1单元格中写入公式 =range(1, rand()*20) 随机产生一个最大值在0和20之间的数字序列,A2单元格内容为A1单元格数字序列中所有小于5的数减1组成的新序列,要实现此功能,一般的常用公式会非常复杂,所以可以用脚本公式实现,在A2单元格中输入以下公式:
var a1 = array('${A1}');
var r = [];
a1.forEach(function(value, index) {
if (value > 5) {
r.push(value - 1);
}
});
return r;
预览效果如下图所示:
3.3 嵌套常规函数
脚本函数中,除了使用单元格和参数外,也可以调用常规公式,比如求A1-D1单元格的和并判断和是否大于5,判断结果显示在A2单元格,即在A1-D1单元格随机输入数字,合并A2-D2单元格输入以下公式:
var r = number('${sum(A1:D1)}');
if (r < 5) {
return "汇总值小于5";
} else {
return "汇总值不小于5";
}
实现效果如下图所示:
4. 注意事项
公式中的脚本定义完全遵循 ECMAScript3 语法规则,支持大部分 ES5 语法规则。
具体使用可参考:轻松学习 JavaScript