自定义函数
教学视频
说明
只需要两步,就可以自定义自己的函数在报表中使用。
1.扩展com.basksoft.report.core.expression.function.Function类
在这个抽象类中需要实现的方法是下面三个:
public abstract String name();
public abstract String category();
public abstract String desc();
下面是uuid这个函数的实现源码:
package com.basksoft.report.core.expression.function.other;
import java.util.List;
import java.util.UUID;
import com.basksoft.report.core.expression.function.CategoryConstants;
import com.basksoft.report.core.expression.function.Function;
import com.basksoft.report.core.expression.model.data.ExpressionData;
import com.basksoft.report.core.expression.model.data.ObjectData;
import com.basksoft.report.core.runtime.build.ExecutionContext;
public class UuidFunction extends Function {
@Override
public ExpressionData<?> execute(List<Object> parameters, ExecutionContext context) {
String uuid = UUID.randomUUID().toString();
return new ObjectData(uuid);
}
@Override
public String name() {
return "uuid";
}
@Override
public String category() {
return CategoryConstants.OTHER_CATEGORY;
}
@Override
public String desc() {
return "语法:uuid()。<br>UUID是全球唯一识别码(Universally Unique Identifier)的缩写,该函数每次调用都会生成一个全球唯一的ID。";
}
}
2.注册实现类
在项目源码根目录下创建一个名为META-INF的目录(如果没有的话),在META-INF目录下创建一个名为services的目录,在该目录下创建一个名为com.basksoft.report.core.expression.function.Function的文件,最后将com.basksoft.report.core.expression.function.Function实现类的完整类路径添加到这个文件当中,这样就完成了自定义函数类的注册工作,如下图所示:
最后重启应用,就可以使用自定义的函数。
3.参考范例
import java.util.List;
import com.basksoft.report.core.expression.function.Function;
import com.basksoft.report.core.expression.model.data.ExpressionData;
import com.basksoft.report.core.runtime.build.ReportExpressionContext;
import com.basksoft.report.core.expression.model.data.ObjectData;
import com.basksoft.report.core.expression.model.data.NullData;
import com.basksoft.core.exception.InfoException;
public class TestFunction extends Function {
@Override
public ExpressionData<?> execute(List<Object> parameters, ReportExpressionContext context) {
if(parameters.size()!=1) {
throw new InfoException("StringLen 函数运行时参数只能有一个.");
}
Object obj=extractData(parameters.get(0));
if(obj!=null) {
int length=obj.toString().length();
return new ObjectData(length);
}
return new NullData();
}
@Override
public String name() {
return "StringLen";
}
@Override
public String label() {
return "计算字符串长度";
}
@Override
public String category() {
return "自定义函数分类";
}
@Override
public String desc() {
return "该函数实现字符串长度的计算,范例: StringLen(\"Hello World!\")";
}
@Override
public String parametersCount() {
return "=1";
}
}