自定义函数

教学视频

说明

只需要两步,就可以自定义自己的函数在报表中使用。

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实现类的完整类路径添加到这个文件当中,这样就完成了自定义函数类的注册工作,如下图所示:

image-20211129132425805

最后重启应用,就可以使用自定义的函数。

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";
    }

}

results matching ""

    No results matching ""