Java軟件報表軟件技術博客

          java報表軟件技術匯總 java報表軟件制作 報表軟件新聞
          posts - 355, comments - 100, trackbacks - 0, articles - 3
             :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

          在數據庫表中,其中字段XML所存的為xml格式數據在表xmltest中。那么在使用該表進行報表制作時,需要將存于xml字段中的值讀取出來作為報表數據源。


          XML每條記錄數據格式如下:

          <Field><Name>MemoryFreeSize</Name><Type>int</Type><Value>1962</Value></Field>

          <Field><Name>MemoryTotalSize</Name><Type>int</Type><Value>2047</Value></Field>

          <Field><Name>MemoryUsage</Name><Type>int</Type><Value>4</Value></Field> ;

          <Field><Name>MemoryFreeSize</Name><Type>Int</Type><Value>1999</Value></Field>

          <Field><Name>MemoryTotalSize</Name><Type>Int</Type><Value>2048</Value></Field>

          <Field><Name>MemoryUsage</Name><Type>Int</Type><Value>10</Value></Field>;

          <Field><Name>MemoryFreeSize</Name><Type>Int</Type><Value>2000</Value></Field>

          <Field><Name>MemoryTotalSize</Name><Type>Int</Type><Value>2050</Value></Field>

          <Field><Name>MemoryUsage</Name><Type>Int</Type><Value>15</Value></Field>

          最終用于制作報表的數據源形式如下:


          對于這樣的情況要如何來實現呢?FineReport中可以通過自定義程序數據集來對xml字段數據進行解析,最終返回所希望的數據報表。

          帆軟報表FineReport的數據來源可以是任何類型的數據,因此FineReport是通過AbstractTableData抽象類,也就可以用自定義類型的程序數據集,數據來源是通過把xml格式數據轉入ArrayList中。

          數據集初始化方法init()

          連接目標數據庫后,執行sql查詢語句,將xmltest表數據全部查詢出來,對于ID、NAME字段的值將直接存于新的結果集ArrayList中,對于xml字段通過GetXmlDate類對其進行解析后再轉入ArrayList中。

          GetXmlDate類代碼如下:

          package com.fr.data;    
              
          import java.io.InputStream;    
          import java.io.InputStreamReader;    
          import java.io.Reader;    
          import java.util.logging.Level;    
          import com.fr.base.FRContext;     
          import com.fr.stable.xml.XMLReadable;  
          import com.fr.stable.xml.XMLableReader;  
              
          public class GetXmlDate {    
              // 定義返回值數組    
              private String[] Value = new String[3];    
              // 定義查詢的name值    
              private String[] Name = null;    
              
              protected String[] readerXMLSource(InputStream in, String[] name)    
                      throws Exception {    
                  Name = name;    
                  InputStreamReader reader = new InputStreamReader(in, "utf-8");    
                  readXMLSource(reader);    
                  return Value;    
              }    
              
              protected void readXMLSource(Reader reader) throws Exception {    
                  XMLableReader xmlReader = XMLableReader.createXMLableReader(reader);    
                  if (xmlReader != null) {    
                      xmlReader.readXMLObject(new Content());    
              
                  }    
              }    
              
              private class Content implements XMLReadable {    
                  public void readXML(XMLableReader reader) {    
                      if (reader.isChildNode()) {    
                          if (reader.getTagName().equals("Field")) {    
                              Field field = new Field();    
                              reader.readXMLObject(field);    
                              // 獲得name對應的value值    
                              if (Name[0].equals(field.name)) {    
                                  Value[0= field.value;    
                              } else if (Name[1].equals(field.name)) {    
                                  Value[1= field.value;    
                              } else if (Name[2].equals(field.name)) {    
                                  Value[2= field.value;    
                              }    
                          }    
                      }    
                  }    
              }    
              
              // 定義每個field的結構    
              private class Field implements XMLReadable {    
                  private String name;    
                  private String type;    
                  private String value;    
              
                  public void readXML(XMLableReader reader) {    
                      if (reader.isChildNode()) {    
                          String tagName = reader.getTagName();    
                          if (tagName.equals("Name")) {    
                              this.name = reader.getElementValue();    
                          } else if (tagName.equals("Type")) {    
                              this.type = reader.getElementValue();    
                          } else if (tagName.equals("Value")) {    
                              this.value = reader.getElementValue();    
                          }    
                      }    
                  }    
              }    
          }  

          定義程序數據集

          定義類XMLRead.java,繼承AbstractTableData接口,實現getColumnCount、getColumnName、getRowCount、getValueAt四個方法;
          XMLRead.java類代碼如下:

          package com.fr.data;    
              
          import java.io.InputStream;     
          import java.io.StringBufferInputStream;  
          import java.sql.Connection;    
          import java.sql.DriverManager;    
          import java.sql.ResultSet;    
          import java.sql.Statement;    
          import java.util.ArrayList;      
          import com.fr.data.AbstractTableData;    
              
          public class XMLRead extends AbstractTableData {    
              // 列名數組,保存程序數據集所有列名    
              private String[] columnNames = { "id""name""MemoryFreeSize",    
                      "MemoryTotalSize""MemoryUsage" };    
              // 保存表數據    
              private ArrayList valueList = null;    
              
              public int getColumnCount() {    
                  return 5;    
              }    
              
              public String getColumnName(int columnIndex) {    
                  return columnNames[columnIndex];    
              }    
              
              public int getRowCount() {    
                  init();    
                  return valueList.size();    
              }    
              
              public Object getValueAt(int rowIndex, int columnIndex) {    
                  init();    
                  return ((Object[]) valueList.get(rowIndex))[columnIndex];    
              }    
              
              private void init() {    
                  // 確保只被執行一次    
                  if (valueList != null) {    
                      return;    
                  }    
                  valueList = new ArrayList();    
                  String sql = "select * from xmltest";    
                  String[] name = { "MemoryFreeSize""MemoryTotalSize""MemoryUsage" };    
                  Connection conn = this.getConncetion();    
                  try {    
                      Statement stmt = conn.createStatement();    
                      ResultSet rs = stmt.executeQuery(sql);    
                      // 用對象保存數據    
                      Object[] objArray = null;    
                      while (rs.next()) {    
                          objArray = new Object[5];    
                          String[] xmldata = null;    
                          objArray[0= rs.getObject(1);    
                          objArray[1= rs.getObject(2);    
                          InputStream in = new StringBufferInputStream("<demo>"    
                                  + rs.getObject(3).toString() + "</demo>");    
                          GetXmlDate getxmldata = new GetXmlDate();    
                          // 對xml流進行解析,返回的為name對應的value值數組    
                          xmldata = getxmldata.readerXMLSource(in, name);    
                          // 將解析后的值存于最終結果ArrayList中    
                          objArray[2= xmldata[0];    
                          objArray[3= xmldata[1];    
                          objArray[4= xmldata[2];    
                          valueList.add(objArray);    
                      }    
                      // 釋放數據源    
                      rs.close();    
                      stmt.close();    
                      conn.close();    
                  } catch (Exception e) {    
                      e.printStackTrace();    
                  }    
              }    
              
              public Connection getConncetion() {    
                  String driverName = "oracle.jdbc.driver.OracleDriver";    
                  String url = "jdbc:oracle:thin:@192.168.100.169:1521:orcl10g";    
                  String username = "temp";    
                  String password = "temp123";    
                  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;    
              }    
          }  

          上述代碼中的數據庫連接改動自己存檔xmltest表的數據庫

          編譯程序數據源

          首先編譯GetXmlDate.java然后再編譯XMLRead.java,將生成的class文件放于WEB-INF/classes/com/fr/data下。

          配置程序數據源

          新建報表,報表數據集>程序數據集,選擇定義好的程序數據集XMLRead.class文件,名字可以自定義,如ds1。

          使用程序數據源

          制作報表保存為xmlread.cpt,如下:


          BS訪問報表,效果如下:


          數據庫表字段為XML類型的數據就可以轉換報表數據源了。

           



          主站蜘蛛池模板: 宜丰县| 高雄市| 通榆县| 林西县| 萨迦县| 许昌市| 聂荣县| 陇南市| 普洱| 娱乐| 承德市| 禹州市| 汝阳县| 毕节市| 英德市| 方城县| 东阿县| 新乐市| 宾川县| 云梦县| 景德镇市| 东平县| 麻阳| 阳朔县| 阳曲县| 威信县| 平遥县| 若尔盖县| 公主岭市| 潮州市| 林芝县| 奈曼旗| 阳信县| 金堂县| 剑川县| 嘉峪关市| 吉木萨尔县| 永福县| 南雄市| 新津县| 祁阳县|