在Java報表工具的實際應用中,可能需要根據表名動態地改變數據源,比如在程序數據集中,通過傳進的表名參數,到數據庫取出對應的表作為數據源。以下就對這種情況舉例說明。
1. 定義程序數據源
首先在構建函數中定義好所用的程序數據集表結構,通過參數獲得表名;其次在初始化函數中準備數據并放入定義的表中;完整代碼如下:
package com.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import com.fr.base.FRContext;
import com.fr.data.AbstractTableData;
import com.fr.report.parameter.Parameter;
public class ParamTableDataDemo extends AbstractTableData{
//列名數組,保存程序數據集所有列名
private String[] columnNames = null;
//定義程序數據集的列數量
private int columnNum = 10;
//保存查詢表的實際列數量
private int colNum = 0;
//保存查詢得到列值
private ArrayList valueList = null;
//構造函數,定義表結構,該表有10個數據列,列名為column#0,column#1,。。。。。。column#9
public ParamTableDataDemo(){
//定義tableName參數
this.parameters = new Parameter[]{new Parameter("tableName")};
//定義程序數據集列名
columnNames = new String[columnNum];
for(int i=0;i<columnNum;i++){
columnNames[i] = "column#" + String.valueOf(i);
}
}
//實現其他四個方法
public int getColumnCount(){
return columnNum;
}
public String getColumnName(int columnIndex){
return columnNames[columnIndex];
}
public int getRowCount(){
init();
return valueList.size();
}
public Object getValueAt(int rowIndex, int columnIndex){
init();
if (columnIndex >= colNum) {
return null;
}
return ((Object[])valueList.get(rowIndex))[columnIndex];
}
//準備數據
public void init(){
//確保只被執行一次
if(valueList != null){
return;
}
//保存得到的數據庫表名
String tableName = parameters[0].getValue().toString();
//構造SQL語句,并打印出來
String sql = "select * from " + tableName + ";";
FRContext.getLogger().log(Level.INFO, "Query SQL of ParamTableDataDemo: \n" + sql);
//保存得到的結果集
valueList = new ArrayList();
//下面開始建立數據庫連接,按照剛才的SQL語句進行查詢
Connection conn = this.getConnection();
try{
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//獲得記錄的詳細信息,然后獲得總列數
ResultSetMetaData rsmd = rs.getMetaData();
colNum = rsmd.getColumnCount();
//用對象保存數據
Object[] objArray=null;
while(rs.next()){
objArray = new Object[colNum];
for(int i = 0; i<colNum ; i++ ){
objArray[i]=rs.getObject(i+1);
}
// 在valueList中加入這一行數據
valueList.add(objArray);
}
//釋放數據庫資源
rs.close();
stmt.close();
conn.close();
//打印一共取到的數據行數量
FRContext.getLogger().log(Level.INFO, "Query SQL of ParamTableDataDemo: \n" + valueList.size() + " rows selected");
}catch(Exception e){
e.printStackTrace();
}
}
// 獲取數據庫連接 driverName 和 url 可以換成您需要的
public Connection getConnection() {
String driverName="sun.jdbc.odbc.JdbcOdbcDriver";
String url="jdbc:odbc:FRDemo";
String username = "";
String password = "";
Connection con = null;
try {
Class.forName(driverName);
con = DriverManager.getConnection(url,username,password);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return con;
}
// 釋放一些資源,因為可能會有重復調用,所以需釋放valueList,將上次查詢的結果釋放掉
public void release() throws Exception {
super.release();
this.valueList = null;
}
}
編譯ParaTableData.java生成ParaTableData.class類。將生成的類文件拷貝到報表工程/WEB-INF/classes目錄下。由于該類是在com.demo包中的,因此最終應該將該ParaTableData.class放在/WEB-INF/classes/com/demo下面。此時該程序數據源便定義好了。
2. 配置程序數據源
? 新建報表
? 在數據集中新建程序數據源,選擇我們定義好的報表程序數據集,如下圖
名字可以自定義,如divtable

3. 使用程序數據集
配置好程序數據源后便可以使用定義的student程序數據集了,選中該數據集點擊預覽按鈕,即可以輸入表名動態地獲取相應的數據表,并制作報表模板,如下圖


可以看到,我們已經將stscore表中的數據提取至程序數據集表中,像其他類型的數據集一樣,可以通過拖拽方法實現單元格數據列綁定。
文章轉自:http://blog.vsharing.com/fanfanzheng/A1371295.html
了解Java報表工具就從這里開始
posted on 2011-07-15 14:06
season 閱讀(173)
評論(0) 編輯 收藏 所屬分類:
Java報表—技術知識