示例1
使用自定义函数可以灵活地实现用户所需的各种个性化计算需求,例如:
- 用自定义函数实现数据类型的转化,比如输入字符串”1.21”,返回整型值1
- 用自定义函数实现计算某个数据集某字段的最小值
- 自定义函数实现将字符串转化为二维码(二维码工具可自行下载)
- 自定义函数实现润乾函数mid的功能
- 用自定义函数实现根据传入的数据集名称、字段名称两个参数,当传入的字段名称列属性为数值类型时返回数据求和的值,为字符串类型时返回数据条数
- 用自定义函数实现,输入参数为日期,返回指定日期属于本月第几个工作日以及剩余工作日数
- 用自定义函数实现,输入参数为2个日期,返回两个日期相隔的工作天数,要求考虑周末和上班时间(上午九点到中午十二点,下午一点到六点)
以下内容提供了应用自定义函数的典型场景以及实现代码,供用户学习参考。
业务场景-计算中位值
实现自定义函数,函数功能为:取数据集中某字段的中位值。
比如emp员工数据集中age年龄字段的中间行数的值,当数据总行数为奇数时取中间行的age值,为偶数时取中间两行的平均age值。
该自定义函数的特点为:
- 涉及参数的传入与处理,在调用函数时需传入两个参数:数据集名称dsName,字段名称fieldname
- 根据传入的参数,在自定义函数中获取对应数据集字段的数据,计算出中位值然后返回
示例代码
下面是该自定义函数类的实现代码:
package com.api;
import com.runqian.report4.dataset.DataSet;
import com.runqian.report4.model.expression.SuperFunction;
import com.runqian.report4.model.expression.Variant2;
import com.runqian.report4.usermodel.Context;
public class getMiddleValue extends SuperFunction {
@Override
public Object calculate(Context ctx, booleanisInput) {
String dsName=this.functionParam.getString(0);//取第一个参数,为指定数据集的名称
String fileName=this.functionParam.getString(1);//取第二个参数,为指定数据集的字段
DataSet ds=ctx.getDataSet(dsName);//从context上下文中根据数据集名称获取到数据集DataSet
intcolNo=ds.getColNo(fileName);//取字段名在数据集中的列号
introwCount=ds.getRowCount();//取数据集的行数
// 判断取哪一行的数据,如果是奇数,取中间位置,如果是偶数,取中间两个位置的数的平均
int age=0;
if(rowCount%2!=0){
//行数为奇数的处理
introwNo=(rowCount/2)+1;//获取中间行数
Object data=ds.getData(rowNo, colNo);//取得指定行列的数据
age=Variant2.intValue(data);
//注意上面不能写为age=((Integer)data).intValue();
//这么写是错误的,异常为java.lang.ClassCastException: java.math.BigDecimal
//必须用Variant2取值,因为每个表达式Expression和Node计算后都是一个结构
//可能是单元格ICell,可能是数据组Group,可能是数据行Row,还有很多种可能
//用Variant2可以取Expression计算后存储于特定结构中的值。
}else{
//行数为偶数的处理
int rowNo1=(rowCount/2);
int data1=Variant2.intValue(ds.getData(rowNo1, colNo));
int rowNo2=(rowCount/2)+1;
int data2=Variant2.intValue(ds.getData(rowNo2, colNo));
age= (data1+data2)/2;
}
return age;
}
}