利用自定义数据集运算函数实现字符串的特殊转化
润乾报表提供了大量的内置函数,但是再多的函数也无法完全满足五花八门的业务需求,于是润乾报表提供了丰富的二次开发接口,以便让报表用户自己来自定义函数。通过自定义函数来轻松方便的解决web报表业务问题,下面就简单介绍一下一个利用自定义数据集运算函数实现特定功能的例子。
例子:现在有三字码和中文名的对应关系,想实现三字码和中文名对应显示,如下图
下面介绍一下具体的实现步骤:
第1步,设计报表如下图
其中,ds1.syb(A2)这个就是自定义数据集函数,参数为A2的值。
第2步,预览报表,有如下效果
数据集运算函数实现思路:
首先,A2扩展后就是一个字符串,把字符串传入数据集函数,代码中用split方法分解并放入String数组中。
其次,将数据集中的字符串和值对应放入HashMap中。
最后,遍历数组,如果数组中数据和HashMap中的key相等,则取出value值利用StringBuffer拼好返回值。
本示例的自定义数据集运算函数代码如下:
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<String, String> map = new HashMap<String, String>();
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<String> 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();
}
}
这样,就使用数据集运算函数实现了三字码和中文名一一对应。