在Java報(bào)表工具的實(shí)際應(yīng)用中,可能需要根據(jù)表名動(dòng)態(tài)地改變數(shù)據(jù)源,比如在程序數(shù)據(jù)集中,通過傳進(jìn)的表名參數(shù),到數(shù)據(jù)庫取出對(duì)應(yīng)的表作為數(shù)據(jù)源。以下就對(duì)這種情況舉例說明。
1. 定義程序數(shù)據(jù)源
首先在構(gòu)建函數(shù)中定義好所用的程序數(shù)據(jù)集表結(jié)構(gòu),通過參數(shù)獲得表名;其次在初始化函數(shù)中準(zhǔn)備數(shù)據(jù)并放入定義的表中;完整代碼如下:
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{
//列名數(shù)組,保存程序數(shù)據(jù)集所有列名
private String[] columnNames = null;
//定義程序數(shù)據(jù)集的列數(shù)量
private int columnNum = 10;
//保存查詢表的實(shí)際列數(shù)量
private int colNum = 0;
//保存查詢得到列值
private ArrayList valueList = null;
//構(gòu)造函數(shù),定義表結(jié)構(gòu),該表有10個(gè)數(shù)據(jù)列,列名為column#0,column#1,。。。。。。column#9
public ParamTableDataDemo(){
//定義tableName參數(shù)
this.parameters = new Parameter[]{new Parameter("tableName")};
//定義程序數(shù)據(jù)集列名
columnNames = new String[columnNum];
for(int i=0;i<columnNum;i++){
columnNames[i] = "column#" + String.valueOf(i);
}
}
//實(shí)現(xiàn)其他四個(gè)方法
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];
}
//準(zhǔn)備數(shù)據(jù)
public void init(){
//確保只被執(zhí)行一次
if(valueList != null){
return;
}
//保存得到的數(shù)據(jù)庫表名
String tableName = parameters[0].getValue().toString();
//構(gòu)造SQL語句,并打印出來
String sql = "select * from " + tableName + ";";
FRContext.getLogger().log(Level.INFO, "Query SQL of ParamTableDataDemo: \n" + sql);
//保存得到的結(jié)果集
valueList = new ArrayList();
//下面開始建立數(shù)據(jù)庫連接,按照剛才的SQL語句進(jìn)行查詢
Connection conn = this.getConnection();
try{
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//獲得記錄的詳細(xì)信息,然后獲得總列數(shù)
ResultSetMetaData rsmd = rs.getMetaData();
colNum = rsmd.getColumnCount();
//用對(duì)象保存數(shù)據(jù)
Object[] objArray=null;
while(rs.next()){
objArray = new Object[colNum];
for(int i = 0; i<colNum ; i++ ){
objArray[i]=rs.getObject(i+1);
}
// 在valueList中加入這一行數(shù)據(jù)
valueList.add(objArray);
}
//釋放數(shù)據(jù)庫資源
rs.close();
stmt.close();
conn.close();
//打印一共取到的數(shù)據(jù)行數(shù)量
FRContext.getLogger().log(Level.INFO, "Query SQL of ParamTableDataDemo: \n" + valueList.size() + " rows selected");
}catch(Exception e){
e.printStackTrace();
}
}
// 獲取數(shù)據(jù)庫連接 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;
}
// 釋放一些資源,因?yàn)榭赡軙?huì)有重復(fù)調(diào)用,所以需釋放valueList,將上次查詢的結(jié)果釋放掉
public void release() throws Exception {
super.release();
this.valueList = null;
}
}
編譯ParaTableData.java生成ParaTableData.class類。將生成的類文件拷貝到報(bào)表工程/WEB-INF/classes目錄下。由于該類是在com.demo包中的,因此最終應(yīng)該將該ParaTableData.class放在/WEB-INF/classes/com/demo下面。此時(shí)該程序數(shù)據(jù)源便定義好了。
2. 配置程序數(shù)據(jù)源
? 新建報(bào)表
? 在數(shù)據(jù)集中新建程序數(shù)據(jù)源,選擇我們定義好的報(bào)表程序數(shù)據(jù)集,如下圖
名字可以自定義,如divtable
3. 使用程序數(shù)據(jù)集
配置好程序數(shù)據(jù)源后便可以使用定義的student程序數(shù)據(jù)集了,選中該數(shù)據(jù)集點(diǎn)擊預(yù)覽按鈕,即可以輸入表名動(dòng)態(tài)地獲取相應(yīng)的數(shù)據(jù)表,并制作報(bào)表模板,如下圖
可以看到,我們已經(jīng)將stscore表中的數(shù)據(jù)提取至程序數(shù)據(jù)集表中,像其他類型的數(shù)據(jù)集一樣,可以通過拖拽方法實(shí)現(xiàn)單元格數(shù)據(jù)列綁定。
文章轉(zhuǎn)自:http://blog.vsharing.com/fanfanzheng/A1371295.html
了解Java報(bào)表工具就從這里開始