Java报表工具带参程序数据集

Java报表工具带参程序数据集

       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#0column#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

Java报表工具带参程序数据集_第1张图片

 

3. 使用程序数据集

       配置好程序数据源后便可以使用定义的student程序数据集了,选中该数据集点击预览按钮,即可以输入表名动态地获取相应的数据表,并制作报表模板,如下图

Java报表工具带参程序数据集_第2张图片

 

Java报表工具带参程序数据集_第3张图片

 

可以看到,我们已经将stscore表中的数据提取至程序数据集表中,像其他类型的数据集一样,可以通过拖拽方法实现单元格数据列绑定。

文章转自:http://blog.vsharing.com/fanfanzheng/A1371295.html



了解Java报表工具就从这里开始

你可能感兴趣的:(Java报表工具带参程序数据集)