润乾报表中API自定义数据集

报表的数据来源大部分来自数据库,正常情况润乾报表都能自动处理,但是也会有特殊的情况,例如通过中间件连接数据库而非直连?通过业务程序算出的数据传递给报表进行展现等等。因此需要用户自定义数据集,我们看一个例子。

 新建一个类文件,在类文件中写如下代码:

package test;

import java.sql.Connection;

import java.util.Iterator;

import java.util.Map;

import com.runqian.report4.dataset.DataSet;

import com.runqian.report4.dataset.IDataSetFactory;

import com.runqian.report4.dataset.Row;

import com.runqian.report4.usermodel.Context;

import com.runqian.report4.usermodel.CustomDataSetConfig;

import com.runqian.report4.usermodel.DataSetConfig;

public class MyDataSet implements IDataSetFactory {

    public DataSet createDataSet(Context ctx, DataSetConfig dsc, boolean isinput) {

       System.out.println("aa");

       //获取系统数据源

       String datasourceName = dsc.getDataSourceName();

       if( datasourceName==null || "".equals(datasourceName) )

           //判断用户是否对数据集设置了数据源名,如果没有,则直接读取系统默认的数据源

           datasourceName = ctx.getDefDataSourceName();

       Connection con;

       try {

           con = ctx.getConnectionFactory( datasourceName ).getConnection();

           System.out.println( "得到的数据源是:"+con );

           con.close();

       } catch (Exception ex) {

           ex.printStackTrace();

       }

       //取得参数列表并分别取得它的参数名与值,宏与之类似

       Map map = ctx.getParamMap(false);

       if( map != null ){

           Iterator it = map.keySet().iterator();

             while( it.hasNext() ){

             //分别取得参数

             String key = it.next().toString();

             String value = map.get(key).toString();

             System.out.println("报表传入的参数"+key+"的值是:"+value);

             }

       }

      

       //读取定义数据集时定义的传入参数

       CustomDataSetConfig cdsc = (CustomDataSetConfig)dsc;

        String[] args = cdsc.getArgNames();

        String[] vals = cdsc.getArgValue();

        if( args != null ){

          forint i=0; ilength; i++ ){

          String key = args[i];

          String value = vals[i];

          System.out.println("定义数据集时传入参数"+key+"的值是:"+value);

          }

        }

       

       //读取同一报表中已算出的数据集

        //DataSet ds = ctx.getDataSet("ds1");

        //System.out.println("数据集ds1共有 "+ds.getColCount()+" 列字段");

      

        //构造一个数据集

        DataSet ds2 = new DataSet("ds2");

        String[] filds = dataset[0];

        for(int i=0; i < filds.length; i ++){

        ds2.addCol( filds[i] );//设置数据集的字段

        System.out.println("设置数据集的字段:"+filds[i]);

        }

       

        //设置数据集中的数据

        for(int i = 1; i < dataset.length; i ++ ){

        String[] datas = dataset[i];

        Row rr = ds2.addRow();

        for(int j = 0; j < datas.length; j ++){

            rr.setData(j+1,datas[j]);

            System.out.println("设置数据集的数据第"+i+" "+j+"列的值:"+datas[j]);

        }

        }

       

       return ds2;

    }

   

    //定义一个二维数组作为本自定义数据集的来源

    String [][] dataset = {

           {"id","name","zhi"},

           {"1","a","100"},

           {"2","b","200"},

           {"3","c","300"}

    };

}

2 将类文件拷贝到相应文件下

在设计器中使用自定义类应把编译后的.class文件放在designer\classes\自定义类所在的包名下面。比如MyDataSet.java在test包中,那么就应该把编译后的MyDataSet.class文件放在设计器安装路径\ reportHome\designer\classes\test包中,如果classes下面不包含test包,用户需要自己新建。

在服务器中运行使用自定义类的报表文件时应把自定义类编译后的.class文件放在reportHome\webapps\WEB-INF\classes\自定义类所在的包名下面。比如MyDataSet.java在test包中,那么就应该把编译后的MyDataSet.class文件放在设计器安装路径\reportHome\webapps\WEB-INF\classes\test包中,如果classes下面不包含test包,用户需要自己新建。

3 再建一张报表文件,如下图:

 

4 报表中设置自定义数据集,如下图:

 润乾报表中API自定义数据集_第1张图片

5 点浏览,就能看到结果了,如下图:

 

 


 

你可能感兴趣的:(报表应用)