快逸报表用自定义函数实现字符串的特殊转化
快逸报表提供了大量的内置函数,但是再多的函数也无法完全满足五花八门的业务需求,于是快逸提供了丰富的二次开发接口,以便让报表用户自己来自定义函数,通过自定义函数来轻松方便的解决web报表业务问题,下面就是一个利用自定义数据集运算函数实现特定功能的例子。
需求如下:
下图所对应的是创建报表模版:
对应的实现效果图:
实现思路:
1:A2扩展后就是一个字符串,把字符串传入数据集函数,代码中用split方法分解并放入String数组中。
2:将数据集中的字符串和值对应放入HashMap中。
3:遍历数组,如果数组中数据和HashMap中的key相等,则取出value值利用StringBuffer拼好返回值。
自定义函数的用法可以参照:快逸应用开发教程- 3.4.1 自定义函数介绍章节
本示例的自定义数据集运算函数代码如下:
package com.runqian;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.runqian.base4.resources.EngineMessage;
import com.runqian.base4.resources.MessageManager;
import com.runqian.base4.util.ReportError;
import com.runqian.report4.dataset.DataSet;
import com.runqian.report4.dataset.DsValue;
import com.runqian.report4.dataset.Group;
import com.runqian.report4.model.expression.DSFunction;
import com.runqian.report4.model.expression.Expression;
import com.runqian.report4.model.expression.Variant2;
import com.runqian.report4.usermodel.Context;
public class CharZhuan extends DSFunction {
@Override
public Object calculate(Context ctx, boolean isInput) {
// TODO Auto-generated method stub
if (this.paramList.size() < 1) {
MessageManager mm = EngineMessage.get();
throw new ReportError(“paramater:”
+ mm.getMessage(“function.missingParam”));
// 取得第一个参数,默认为表达式,需要把该表达式算出来,结果才是函数的参数值
Expression param1 = (Expression) this.paramList.get(0);
if (param1 == null) { // 判断参数是否为空
MessageManager mm = EngineMessage.get();
throw new ReportError(“paramater:”
+ mm.getMessage(“function.invalidParam”));
// 算出第一个参数值
Object result1 = Variant2.getValue(param1.calculate(ctx, isInput),
false, isInput);
System.out.println(result1.toString());
// 判断第一个参数值是否为空
if (result1 == null) {
return null;
// 判断第一个参数值的数据类型
if (!(result1 instanceof String)) {
MessageManager mm = EngineMessage.get();
throw new ReportError(“parameter:”
+ mm.getMessage(“function.paramTypeError”));
Group group = null;
DsValue cur = this.ds.getCurrent();
group = (Group) cur;
DataSet ds = group.getDataSet();
int countRow = ds.getRowCount();
// 将码表的对应值放到hashmap中
Map map = new HashMap ();
for (int i = 1; i <= countRow; i++) {
int j = 1;
//获得某位置的数据
map.put(ds.getData(i, j).toString(), ds.getData(i, j + 1)
.toString());
StringBuffer sb = new StringBuffer();
// 对第一个参数进行split分解.
String[] str = ((String) result1).split(“-”);
System.out.println(str[0] + str[1]);
Set keySet = map.keySet();
//以下for循环为每个字符串找相应的汉字,并用-连接起来
for (int i = 0; i < str.length; i++) {
//遍历HashMap找key与目标字符串相等的值
for (String key : keySet) {
if (key.equals(str[i])) {
//如果相当,则获得与key对应的value,append到StringBuffer中
sb.append(map.get(key));
sb.append(“-”);
return sb.delete(sb.length() – 1, sb.length()).toString();
}
总结:通过上面自定义函数和对函数的调用就可以实现本文开头的特殊业务需求了,可见自定义函数功能的强大,然而本文中的例子也仅仅是自定义函数的一个普通应用,快逸报表提供的普通函数和数据集运算函数的接口能够处理的业务需求远不止此,更强大更实用的功能还等待我们去尝试。