润乾报表之添加自定义方法。。。

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、复制自定义方法类到 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:第四步-->总结

接下来我们可以自定义更多自己想要定义的类,维护方便,调用方便,自己能写内置方法,再也不用含着泪看内置方法的文档了!

 

posted @ 2016-08-23 09:18  v魂之挽歌  阅读(722)  评论(0编辑  收藏  举报