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


    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:第四步-->总结

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

  • 相关阅读:
    c# 门禁随笔
    DataTable到Access
    C#文件上传
    C#操作文件
    JavaScript 全局封装
    jsavascript 目录的操作(摘抄)
    12-STM32 ADC原理
    11-STM32 高级定时器TIM1/8
    10-STM32 基本定时器TIM
    9-STM32 WWDG窗口看门狗
  • 原文地址:https://www.cnblogs.com/doublegi/p/5797978.html
Copyright © 2020-2023  润新知