Q:如何添加自定义方法
我们在开发过程中由于业务多样,内置的方法有限,或者有些不太理解,干脆就不使用了,而是想使用我们熟悉的一些工具类。
下面我们来准备一下内置方法的定义和部署使用
A:第一步-->准备方法
1 packagecom.longtu.leaf.util;2
3 importjava.util.HashMap;4 importjava.util.Map;5
6 importcom.runqian.base4.resources.EngineMessage;7 importcom.runqian.base4.resources.MessageManager;8 importcom.runqian.base4.util.ReportError;9 importcom.runqian.report4.model.expression.Expression;10 importcom.runqian.report4.model.expression.Function;11 importcom.runqian.report4.model.expression.Variant2;12 importcom.runqian.report4.usermodel.Context;13 /**
14 * @植入润乾报表的方法。根据键值获取真实值。如AA=2 获取2的值。15 *@authorxiao 2014年3月31日11:49:1316 *17 */
18 public class RunQian_getKeyValue extendsFunction{19
20 /**
21 *22 *@paramstr 目标str,用来转换为map;如过程返回AA=2 则{AA=2}23 *@paramkey24 *@paramsesign 为各键值之间的分隔符25 *@paramkv_sesign 为各键与值之间的分隔符26 *@return
27 */
28 public staticString getMapValueByKey(String str,String key,String sesign,String kv_sesign)29 {30 Map map =convertArrToMap(str, sesign, kv_sesign);31 returnmap.get(key);32 }33
34 public static MapconvertArrToMap(String str,String sesign,String kv_sesign)35 {36 String _mapKey = "";37 String _mapValue = "";38 String [] convertArr = null;39 Map map = new HashMap();40 if(sesign == null || "".equals(sesign))41 sesign=";"; //默认
42 try{43 convertArr =str.split(sesign);44 if(convertArr.length>0)45 {46 for(int i = 0;i
49 if(_keyValue.length>0){50 _mapKey = _keyValue[0].toString().trim();51 _mapValue = _keyValue[1].toString().trim();52 map.put(_mapKey,_mapValue);53 }else{54 System.err.println("请检查目标字符串中的key-value之间是否是【"+kv_sesign+"】号隔开");55 }56 }57 }58 }catch(Exception e){59 System.err.println("com.longtu.leaf.util.RunQian_getKeyValue中的方法:【convertArrToMap】出错" +e.getMessage());60 }61 returnmap;62 }63
64 @Override65 public Object calculate(Context ctx, booleanisInput) {66 //判断是否传参
67 if(this.paramList.size()<1)68 {69 MessageManager mm =EngineMessage.get();70 throw new ReportError("encrypt:"+mm.getMessage("function.missingParam"));71 }72 //获取参数
73 Expression param1 = (Expression)this.paramList.get(0);//第1参
74 Expression param2 = (Expression)this.paramList.get(1);//第2参
75 Expression param3 = (Expression)this.paramList.get(2);//第3参
76 Expression param4 = (Expression)this.paramList.get(3);//第4参
77
78 Object result1 = Variant2.getValue(param1.calculate(ctx,isInput), false, isInput);79 Object result2 = Variant2.getValue(param2.calculate(ctx,isInput), false, isInput);80 Object result3 = Variant2.getValue(param3.calculate(ctx,isInput), false, isInput);81 Object result4 = Variant2.getValue(param4.calculate(ctx,isInput), false, isInput);82
83
84 //似乎不走方法?
85 String _mapKey = "";86 String _mapValue = "";87 String [] convertArr = null;88 Map map = new HashMap();89 if(result3 == null || "".equals(result3))90 result3=";"; //默认
91 try{92 convertArr =result1.toString().split(result3.toString());93 if(convertArr.length>0)94 {95 for(int i = 0;i
98 if(_keyValue.length>0){99 _mapKey = _keyValue[0].toString().trim();100 _mapValue = _keyValue[1].toString().trim();101 map.put(_mapKey,_mapValue);102 }else{103 System.err.println("请检查目标字符串中的key-value之间是否是【"+result4+"】号隔开");104 }105 }106 }107 }catch(Exception e){108 System.out.println("com.longtu.leaf.util.RunQian_getKeyValue中的方法:【convertArrToMap】出错" +e.getMessage());109 }110 returnmap.get(result2.toString());111 }112 public static voidmain(String[] args) {113 //System.out.println(getMapValueByKey("aa=2;","aa",null,"="));
114 }115
116 }
这里提供了一个key-value方法,即通过字符串str='aa=2;bb=3;cc=4' 中的键值aa、bb、cc获取对应value值。
自定义方法:
1、继承com.runqian.report4.model.expression.Function
2、重写里边的calculate
具体查看以上代码。
A:第二步-->准备配置文件
src/config/跟目录下创建customFunctions.properties,内容:
#1使用方法:getMapValueByKey("aa=2;","aa",null,"=");//return 2;
fun_getMapValueByKey=0,com.longtu.leaf.util.RunQian_getKeyValue
配置方式:
1、复制自定义方法类到 reportHome\designer\web\WEB-INF\classes 下,方法含包则相应创建。
2、复制customFunctions.properties信息到reportHome\designer\web\WEB-INF\classes\config\
配置完成后重启生效。
问题:
由于配置完成后打开工具,找不到对应的内置方法,没关系,能调用即可。
A:第三步-->方法调用
在某个单元格表达式中:fun_getMapValueByKey(o_sumstr,"pro_requestamt",",","=")
其中fun_getMapValueByKey对应的是前面配置的属性文件中的键值。
A:第四步-->总结
接下来我们可以自定义更多自己想要定义的类,维护方便,调用方便,自己能写内置方法,再也不用含着泪看内置方法的文档了!