實際報表開發中,常需根據傳入參數(如表名)動態查詢不同資料表。FineReport 通過繼承 AbstractTableData 抽象類實現「程序數據集」,支援帶參數的動態數據源。
public class ParamTableDataDemo extends AbstractTableData {
private String[] columnNames = null;
private int columnNum = 10; // 最大列數
private int colNum = 0; // 實際查詢列數
private ArrayList valueList = null; // 數據緩存
public ParamTableDataDemo() {
// 定義參數:tableName
setDefaultParameters(new Parameter[] { new Parameter("tableName") });
// 初始化列名佔位
columnNames = new String[columnNum];
for (int i = 0; i < columnNum; i++) {
columnNames[i] = "column#" + i;
}
}
init()public void init() {
if (valueList != null) return; // 單例模式,避免重複查詢
String tableName = parameters[0].getValue().toString();
String sql = "select * from " + tableName + ";";
FRContext.getLogger().info("Query SQL: " + sql);
valueList = new ArrayList();
Connection conn = getConnection();
try {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
colNum = rsmd.getColumnCount();
Object[] objArray;
while (rs.next()) {
objArray = new Object[colNum];
for (int i = 0; i < colNum; i++) {
objArray[i] = rs.getObject(i + 1);
}
valueList.add(objArray);
}
rs.close(); stmt.close(); conn.close();
FRContext.getLogger().info("Rows fetched: " + valueList.size());
} catch (Exception e) {
e.printStackTrace();
}
}
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 Connection getConnection() {
String driverName = "org.sqlite.JDBC";
String url = "jdbc:sqlite://D:\\FineReport_8.0\\WebReport\\FRDemo.db";
// 實際專案請替換為生產數據源(JNDI/連接池)
try {
Class.forName(driverName);
return DriverManager.getConnection(url, "", "");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void release() throws Exception {
super.release();
this.valueList = null; // 釋放緩存,支援重複調用
}
ParamTableDataDemo.class 放入報表工程 /WEB-INF/classes/com/fr/data/ 目錄(對應 package)。com.fr.data.ParamTableDataDemo,自定義名稱(如 divtable)。STSCORE),點擊預覽即可動態獲取數據。ArrayList。valueList 為實例變量,FineReport 會為每次查詢創建新實例,天然線程安全。