Q:如何添加自定义方法
我们在开发过程中由于业务多样,内置的方法有限,或者有些不太理解,干脆就不使用了,而是想使用我们熟悉的一些工具类。
下面我们来准备一下内置方法的定义和部署使用
A:第一步-->准备方法
1 package com.longtu.leaf.util; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import com.runqian.base4.resources.EngineMessage; 7 import com.runqian.base4.resources.MessageManager; 8 import com.runqian.base4.util.ReportError; 9 import com.runqian.report4.model.expression.Expression; 10 import com.runqian.report4.model.expression.Function; 11 import com.runqian.report4.model.expression.Variant2; 12 import com.runqian.report4.usermodel.Context; 13 /** 14 * @植入润乾报表的方法。根据键值获取真实值。如AA=2 获取2的值。 15 * @author xiao 2014年3月31日11:49:13 16 * 17 */ 18 public class RunQian_getKeyValue extends Function{ 19 20 /** 21 * 22 * @param str 目标str,用来转换为map;如过程返回AA=2 则{AA=2} 23 * @param key 24 * @param sesign 为各键值之间的分隔符 25 * @param kv_sesign 为各键与值之间的分隔符 26 * @return 27 */ 28 public static String getMapValueByKey(String str,String key,String sesign,String kv_sesign) 29 { 30 Map<String,String> map = convertArrToMap(str, sesign, kv_sesign); 31 return map.get(key); 32 } 33 34 public static Map<String,String> convertArrToMap(String str,String sesign,String kv_sesign) 35 { 36 String _mapKey = ""; 37 String _mapValue = ""; 38 String [] convertArr = null; 39 Map<String,String> map = new HashMap<String,String>(); 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<convertArr.length;i++) 47 { 48 String _keyValue [] = convertArr[i].split(kv_sesign);//键值数组 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 return map; 62 } 63 64 @Override 65 public Object calculate(Context ctx, boolean isInput) { 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<String,String> map = new HashMap<String,String>(); 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<convertArr.length;i++) 96 { 97 String _keyValue [] = convertArr[i].split(result4.toString());//键值数组 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 return map.get(result2.toString()); 111 } 112 public static void main(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、复制自定义方法类到 reportHomedesignerwebWEB-INFclasses 下,方法含包则相应创建。
2、复制customFunctions.properties信息到reportHomedesignerwebWEB-INFclassesconfig
配置完成后重启生效。
问题:
由于配置完成后打开工具,找不到对应的内置方法,没关系,能调用即可。
A:第三步-->方法调用
在某个单元格表达式中:fun_getMapValueByKey(o_sumstr,"pro_requestamt",",","=")
其中fun_getMapValueByKey对应的是前面配置的属性文件中的键值。
A:第四步-->总结
接下来我们可以自定义更多自己想要定义的类,维护方便,调用方便,自己能写内置方法,再也不用含着泪看内置方法的文档了!