隨筆 - 225  文章 - 98  trackbacks - 0
          <2011年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          隨筆分類

          相冊(cè)

          報(bào)表工具廠商們

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

                 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

          Java報(bào)表工具新建程序數(shù)據(jù)集

           

          3. 使用程序數(shù)據(jù)集

                 配置好程序數(shù)據(jù)源后便可以使用定義的student程序數(shù)據(jù)集了,選中該數(shù)據(jù)集點(diǎn)擊預(yù)覽按鈕,即可以輸入表名動(dòng)態(tài)地獲取相應(yīng)的數(shù)據(jù)表,并制作報(bào)表模板,如下圖

          Java報(bào)表工具使用程序數(shù)據(jù)集

           

          Java報(bào)表工具程序數(shù)據(jù)集預(yù)覽

           

          可以看到,我們已經(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)表工具就從這里開始
          posted on 2011-07-15 14:06 season 閱讀(173) 評(píng)論(0)  編輯  收藏 所屬分類: Java報(bào)表—技術(shù)知識(shí)
          主站蜘蛛池模板: 忻城县| 灵川县| 星子县| 安国市| 买车| 七台河市| 克什克腾旗| 石棉县| 土默特左旗| 时尚| 醴陵市| 沁水县| 茂名市| 游戏| 江达县| 高邑县| 乌兰浩特市| 修水县| 苏尼特左旗| 犍为县| 固安县| 高雄市| 馆陶县| 双桥区| 东明县| 兰溪市| 当涂县| 鄂托克前旗| 同德县| 镇康县| 永康市| 古浪县| 焦作市| 务川| 柘城县| 锡林郭勒盟| 宁化县| 霍城县| 宜黄县| 正阳县| 衡南县|