close

通過TableData介面可以讀取任何形式的數據源,java報表FineReport報表的數據來源可以是資料庫數據或是文本數據,並且還可以是其它任何類型的數據,因為這些所有的數據來源都實現了TableData介面,所以用戶只要實現了TableData介面,也就可以用自定義類型的數據源了。對於傳參,我們可以在程序數據集中寫入傳入的參數,此方案傳入的參數為 tableName 和columnNames 兩項;即傳入資料庫表名以及所需要的列名取出所需要的值;這裡連的資料庫為java報表工具FineReport的內置資料庫,適用時可輸入表名:stscore 列名 name;sex。具體步驟如下:

 

1. 定義程序數據源

1.1 TableData介面簡介

TableData介面所需實現的方法

只要實現了TableData介面,java報表工具FineReport報表引擎就能夠讀取數據源作為報表數據源使用。TableData介面主要有5個方法,如下:

1). public int getColumnCount(); //獲取TableData的總列數

2). public String getColumnName(int columnIndex); //獲取TableData中第columnIndex列的列名。

3). public boolean hasRow(int rowIndex); //判斷是否存在第rowIndex行,這主要是用於處理超大數據時,完全遍歷所有數據獲取總行數相當困難,用這個方法來判斷第rowIndex行是否存在,存在則可讀取。

4). public int getRowCount(); //獲取TableData的總行數。

5).public Object getValueAt(int rowIndex, int columnIndex); //獲取TableData中第columnIndex列,第rowIndex行的數據。

1.2 以PramTableDataDemo為例描述如何實現TableData介面

因為AbstractTableData已經實現了默認的hasRow(int rowIndex)方法,所以可以從AbstractTableData擴展,定義ParamTableDataDemo,代碼如下:

private String splitMark = ";";

// 自定義間隔符 暫定為『;』 即輸入列名參數時需像如此 name;sex;age;

private String[] columnNames = null;

// 列欄位名數組 保存在數據集窗口下一開始顯示的數據列名稱

private int columnNum = 10;

// 自定義需要列出的列數量 即在數據集窗口列出的數據集下的欄位數量

 

String[] colNames = null;

// 保存取到的欄位 即輸入的參數欄位,假如是name;sex 參數欄位即為name 和 sex兩項

private ArrayList valueList = null;

// 保存查詢得到的值列

1.3 構造函數

public ParamTableDataDemo() {

// 定義需要的參數 tablename columnNames

this.parameters = new Parameter[]

{

new Parameter("tableName"),new Parameter("columnNames")

};

// 初始化下列名,暫定為columnName#0,columnName#1......顯示在數據集窗體中的

columnNames = new String[columnNum];

for (int i = 0; i < columnNum; i++)

{

columnNames[i] = "columnNames#" + String.valueOf(i);

}

}

1.4 匹配取值

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

{

If (parameters[i].getName().equals("tableName")) // 做匹配

tableName = parameters[i].getValue().toString();

else

colNames = this.getParameters()[i].getValue().toString().split(

splitMark);

}

1.5 構造SQL語句

String sql = "select ";// 傳入參數中輸入的欄位

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

colNames[i].trim();

if (i == colNames.length - 1)

sql += colNames[i];

else {sql += colNames[i] + ",";} }

sql += " from " + tableName + ";";

1.6 獲得資料庫連接

public Connection getConnection() {

String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";//載入驅動

String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\ProgramFiles\\finereport\\FineReport6.5\\WebReport\\ WEB-INF\\resources\\data\\FRDemo.mdb";

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;

}

具體實現代碼如附件所示

編譯ParamTableDataDemo.java,將生成的ParamTableDataDemo.class文件放到報表伺服器的%\FineReport6.5\WebReport\WEB-INF\classes目錄;注意:如該例子所示,其包名為com.demo,所以其類所在路徑為com\demo

arrow
arrow
    全站熱搜

    leohope 發表在 痞客邦 留言(0) 人氣()