潤乾報表中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
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 ){
for( int 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 點瀏覽,就能看到結果了,如下圖: