通过TableData接口可以读取任何形式的数据源,报表制作工具FineReport报表的数据来源可以是数据库数据或是文本数据,并且还可以是其它任何类型的数据,因为这些所有的数据来源都实现了TableData接口,所以用户只要实现了TableData接口,也就可以用自定义类型的数据源了。对于传参,我们可以在程序数据集中写入传入的参数,此方案传入的参数为tableName 和 columnNames 两项;即传入 数据库表名 以及 所需要的列名 取出所需要的值;这里连的数据库为报表制作系统FineReport的内置数据库,适用时可输入表名:stscore 列名 name;sex。具体步骤如下:
1. 定义程序数据源
1.1 TableData接口简介
TableData接口所需实现的方法
只要实现了TableData接口,报表制作工具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 = newParameter[]
{
new Parameter("tableName"),newParameter("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={MicrosoftAccess 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();
returnnull;
}
returncon;
}
具体实现代码如附件所示
编译ParamTableDataDemo.java,将生成的ParamTableDataDemo.class文件放到报表服务器的%\FineReport6.5\WebReport\WEB-INF\classes目录;注意:如该例子所示,其包名为com.demo,所以其类所在路径为com\demo
2. 配置程序数据集
http://www.finereport.com/forumimages/c-step1.jpg
http://www.finereport.com/forumimages/c-step2.jpg
添加完成后的程序数据集并会在数据面板中出现,如下图所示:
http://www.finereport.com/forumimages/c-step2-1.jpg
在参数对话框中输入需要传递的参数tableName,columnNames如图所示:
http://www.finereport.com/forumimages/c-step2-input.jpg
点击确定之后出现如下图面:
http://www.finereport.com/forumimages/c-step2-3.jpg
图片中的columnName#是在程序数据集中自定义的
3. 使用程序数据集
因为columnNames输入的是两个数据列名,所以columnNames#0,columnNames#1字段中存入了相应的name,sex字段数据
3.1 将columnNames#0,columnNames#1拖到B2,C2单元格中,表样设计如图所示
http://www.finereport.com/forumimages/c-table%20design.jpg
点击设计器预览:再次出现参数窗口,输入相应的参数:
http://www.finereport.com/forumimages/c-input.jpg
再次输入相应的参数,点击确定,预览效果图如下:
http://www.finereport.com/forumimages/c-preview.jpg
注意:程序数据集中的代码在配置时需要改动相应的url,如图所示:
http://www.finereport.com/forumimages/c-notice1.jpg
此驱动和Url对应服务器|自定义数据连接 中的driverName 和 URL
http://www.finereport.com/forumimages/c-notice2.jpg
文章转自:http://blog.vsharing.com/fanfanzheng/A1453262.html