1. 程式人生 > >潤乾報表中API自定義資料集

潤乾報表中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; i<args.length; 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 報表中設定自定義資料集,如下圖:

 

5 點瀏覽,就能看到結果了,如下圖: