隨筆 - 147  文章 - 71  trackbacks - 0
          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類(146)

          隨筆檔案(147)

          文章分類(28)

          文章檔案(28)

          喜歡的Blog

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          文章摘要

          JFreeReport用于生成報表。JFreeReport的數據繼承自Swing組件的TableModel接口,使用基于XML的報表格式定義文件對報表進行格式化。JFreeReport生成的報表可以分頁預覽、打印或者保存為多種格式的文件如pdf、Excel、html等。作者在本文中詳細的介紹了如何定義報表格式定義文件、如何使用JFreeReport生成/預覽報表和將報表轉為其它各種格式。

          關鍵詞

          JFreeReport   報表生成   預覽


          報表生成一直是企業信息化過程中重要的一環,也是目前比較難于實現的一環,今天作者給大家介紹一種新的報表生成組件――JFreeReport。JFreeReport是JFreeReport.Org基于LGPL授權協議提供的一組java包,用于生成各類報表,JFreeReport的數據繼承自Swing組件的TableModel接口,使用基于XML的報表格式定義文件對報表進行格式化。JFreeReport生成的報表可以分頁預覽、打印,而且支持導出為多種格式的文件如pdf、Excel、CSV、html等。更重要的是,JFreeReport不僅支持基于C/S結構的系統,而且支持基于B/S結構的系統中的在線報表顯示。更詳細的關于JFreeReport的介紹請大家訪問JFreeReport的官方網站JFree.org

          1   環境準備

          1.1   JFreeReport組件

          請大家到http://search.download.csdn.net/source/1582346下載JFreeReport組件,下載的是一個ZIP文件,然后將ZIP文件解壓縮到c:\jfreereport(后面的章節中將使用%jfreereport_home%表示這個目錄)目錄下。

          1.2   JFreeReport擴展組件

          請大家到http://www.jfree.org/jfreereport/jfreereport-ext-0.8.4_7.zip下載JFreeReport擴展組件,他用于支持JFreeReport組件生成的報表的在線顯示。請大載后解壓縮到c:\jfreereport-ext目錄下(后面的章節中將使用%jfreereport_ext_home%表示這個目錄)

          1.3   Ant工具

          Apache公司提供的一個基于JAVA的自動化腳本引擎,請大家到http://ant.apache.org/下載ant的可執行文件,關于如何使用ant請大家查看ant的幫助文檔或者http://ant.apache.org/網站上的在線幫助文檔。示例中主要是用ant來負責編譯java代碼。

          1.4   作者提供的代碼


          為了運行本文中作者提到的例子和相關資源文件,請大家下載作者提供的vivianjDemo.zip文件和中文轉換工具gb2unicode.jar。然后解壓縮到%jfreereport_home%\vivianjDemo(后面的章節中將使用%demo _home%表示這個目錄)目錄下。

          2   JFreeReport生成報表的基本步驟


          我們首先演示一個簡單的例子,說明使用JFreeReport生成報表的一些必要的步驟。

          2.1   實例說明


          在這個例子中,我們將循環生成100條數據放入TableModel中,然后使用JFreeReport組件提供的預覽功能在屏幕上顯示生成的報表。

          [注] 為了簡化,這里僅僅是逐條顯示數據,不作任何修飾和統計工作,所以也不使用報表格式定義文件。

          2.2   代碼編制


          整個演示實例(HelloWorld.java)的代碼和相關注釋如下,如果你執行了1.3中規定的步驟,你可以在%demo _home%/src/org/vivianj/jfreereport/看到這個文件。

          import java.awt.Color;
          import java.awt.event.WindowAdapter;
          import java.awt.event.WindowEvent;
          import java.awt.geom.Point2D;
          import javax.swing.table.DefaultTableModel;
          import javax.swing.table.TableModel;

          import org.jfree.report.Boot;
          import org.jfree.report.ElementAlignment;
          import org.jfree.report.JFreeReport;
          import org.jfree.report.ReportProcessingException;
          import org.jfree.report.elementfactory.TextFieldElementFactory;
          import org.jfree.report.modules.gui.base.PreviewDialog;
          import org.jfree.ui.FloatDimension;

          /**
           * 使用JFreeReport生成報表的簡單例子,用于演示使用JFreeReport生成報表的一些基本步驟
           * 
           * 本例子中,為了簡化操作,報表定義是使用java直接編碼
           *
           * @ 作者 : bookman
           
          */

          public class HelloWorld {
              
          /**
               * 處理窗口關閉事件
               
          */

              
          protected static class CloseHandler extends WindowAdapter {
                  
          public void windowClosing(final WindowEvent event) {
                      System.exit(
          0);
                  }

              }


              
          /**
               * 創建和顯示簡單的報表
               
          */

              
          public HelloWorld() {
                  
          // 獲得創建報表需要用到的數據
                  final TableModel data = createData();
                  
          //獲得報表要用到的報表定義內容
                  final JFreeReport report = createReportDefinition();
                  
          //將報表定義和數據結合
                  report.setData(data);
                  
          try {
                      
          //將生成的報表放到預覽窗口中
                      final PreviewDialog preview = new PreviewDialog(report);
                      preview.addWindowListener(
          new CloseHandler());
                      preview.pack();
                      
          //顯示報表預覽窗口
                      preview.setVisible(true);
                  }
           catch (ReportProcessingException e) {
                      System.out.println(e);
                  }


              }


              
          /**
               * 創建生成報表需要用到的數據
               *
               * @返回一個TableModel實例
               
          */

              
          private TableModel createData() {

                  
          final Object[] columnNames = new String[] "Column1""Column2" };
                  
          final DefaultTableModel result = new DefaultTableModel(columnNames, 100);
                  
          int rownum = 0;
                  
          for (; rownum < 100; rownum++{
                      result.setValueAt(
          "say Hello " + rownum + "", rownum, 0);
                      result.setValueAt(
          "say World " + rownum + "", rownum, 1);
                  }


                  
          return result;

              }


              
          /**
               * 創建一個報表定義
               *
               * @返回一個報表定義實例
               
          */

              
          private JFreeReport createReportDefinition() {

                  
          final JFreeReport report = new JFreeReport();
                  report.setName(
          "A Very Simple Report");
                  
          /**
                   * 定義要顯示報表第一列的樣式
                   
          */

                  TextFieldElementFactory factory 
          = new TextFieldElementFactory();
                  factory.setName(
          "T1");
                  factory.setAbsolutePosition(
          new Point2D.Float(00));
                  factory.setMinimumSize(
          new FloatDimension(15020));
                  factory.setColor(Color.black);
                  factory.setHorizontalAlignment(ElementAlignment.LEFT);
                  factory.setVerticalAlignment(ElementAlignment.MIDDLE);
                  factory.setNullString(
          "-");
                  factory.setFieldname(
          "Column1");
                  report.getItemBand().addElement(factory.createElement());
                  
          /**
                   * 定義要顯示報表第二列的樣式
                   
          */

                  factory 
          = new TextFieldElementFactory();
                  factory.setName(
          "T2");
                  factory.setAbsolutePosition(
          new Point2D.Float(2000));
                  factory.setMinimumSize(
          new FloatDimension(15020));
                  factory.setColor(Color.black);
                  factory.setHorizontalAlignment(ElementAlignment.LEFT);
                  factory.setVerticalAlignment(ElementAlignment.MIDDLE);
                  factory.setNullString(
          "-");
                  factory.setFieldname(
          "Column2");
                  report.getItemBand().addElement(factory.createElement());
                  
          /**
                   * 返回一個報表定義的實例
                   
          */

                  
          return report;

              }


              
          public static void main(final String[] args) {
                  
          // 初始化JFreeReport
                  Boot.start();

                  
          //調用演示實例
                  new HelloWorld();
              }


          }


          2.3   運行例子


          如果你執行了1.3中規定的步驟,你可以進入命令行界面,然后進入%demo_home%目錄下,修改setenv.cmd中的相關設置,執行serenv.cmd設置環境變量。執行java org.vivianj.jfreereport.HelloWorld查看運行結果。下面這個圖片是作者執行后結果的屏幕截圖:



          大家可以看到,JFreeReport已經自動幫我們實現了分頁。上面這個圖片顯示的是第一頁的數據,你可以通過工具欄中的查看其它頁面中的內容。


          2.4   基本步驟解釋


          使用JFreeReport生成報表通常需要以下三個基本步驟:



          1. 生成可通過TableModel接口訪問的數據,如本例中的createData方法完成的功能
          2. 生成一個JFreeReport實例,他定義了我們如何格式化顯示數據,如本例中的createReportDefinition方法完成的功能
          3. 將數據和JFreeReport實例連接起來,并且將該JFreeReport實例傳給PreviewDialog的一個實例顯示給用戶


          3   使用JFreeReport生成復雜報表

          3.1   報表定義文件

          報表定義文件是JFreeReport生成復雜報表的重要文件,他就是一個XML文檔,主要描述如何使用指定的格式生成復雜的報表,同時使用報表定義文件也可以在報表格式需要修改時只需要更新該報表定義文件,而不需要修改應用代碼。

          3.1.1   報表定義文件分類

          JFreeReport中使用了兩種基于XML的報表定義文件來保存報表定義信息:簡單格式和擴展格式.很明顯,簡單格式不能夠完全的描述JFreeReport支持的全部報表定義信息,但是他更易于上手使用。而擴展格式則能夠對JFreeReport的報表定義提供完整的支持,但是擴展格式太詳細了,不太容易使用。

          關于這兩種報表定義格式文件所支持的標簽內容以及如何編寫這兩種格式的報表定義文件請大家參考%jfreereport_home%下的jfreereport-0.8.3-A4.pdf中的相關部分,該文件附錄中還包括了這兩種格式的報表定義文件的DTD文檔供大家參考.當然大家也JFreeReport的例子中提供了多種形式的報表定義文件,基本上涵蓋了常用的報表格式定義,大家可以參考這些例子編寫自己的報表定義文件,。

          3.2   代碼編制

          這個例子和2.2中的代碼基本一致,只是報表定義內容不再由java編碼實現,而是由報表定義文件提供,所以調用方面稍微有點不同,詳細的代碼如下,請大家注意其中加粗顯示的部分:

          import java.io.File;
          import javax.swing.table.TableModel;
          import javax.swing.JFrame;

          import org.jfree.ui.RefineryUtilities;
          import org.jfree.report.Boot;
          import org.jfree.report.modules.gui.base.PreviewFrame;
          import org.jfree.report.modules.parser.base.ReportGenerator;
          import org.jfree.report.JFreeReport;

          /**
           * 使用JFreeReport生成復雜報表的例子, 用于演示使用JFreeReport生成復雜報表的一些基本步驟
           * 
           * 本例子中,報表定義使用了報表定義文件,該文件是保存在c:\下的report3.xml文件 本例中使用的報表定義使用了簡單報表定義格式
           *  @ 作者 : bookman
           
          */

          public class JFreeTest {

              
          public JFreeTest(final String urlname, final TableModel data) {
                  
          // 創建對報表定義文件的引用
                  final File in = new File(urlname);
                  ;
                  
          if (in == null{
                      System.out.print(
          " in is null");
                      
          return;
                  }


                  System.out.print(
          "Processing Report: " + in);
                  
          final ReportGenerator gen = ReportGenerator.getInstance();

                  
          try {
                      
          // 從報表定義文件中獲得要用到的報表定義內容
                      final JFreeReport report1 = gen.parseReport(in);
                      
          if (report1 == null{
                          System.out.print(
          " report1 is null");
                          
          return;
                      }

                      
          // 將報表定義和數據結合
                      report1.setData(data);
                      
          // 將生成的報表放到預覽窗口中
                      final PreviewFrame frame1 = new PreviewFrame(report1);
                      frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      frame1.pack();
                      RefineryUtilities.positionFrameRandomly(frame1);
                      frame1.setVisible(
          true);
                      frame1.requestFocus();
                  }
           catch (Exception e) {
                      System.out
                              .print(
          "report.definitionfailure-----------------------\r\n"
                                      
          + e);
                  }

              }


              
          public static void main(String[] args) {
                  Boot.start();

                  
          final TableModel data3 = new SampleData3();
                  @SuppressWarnings(
          "unused")
                  JFreeTest jft 
          = new JFreeTest("c:\\report3.xml", data3);
              }

          }

           

          import javax.swing.table.AbstractTableModel;

          public class SampleData3 extends AbstractTableModel {
              
          /**
               * 
               
          */

              
          private static final long serialVersionUID = 1L;

              
          /** Storage for the data. */
              
          private final Object[][] data;

              
          /**
               * Default constructor - builds a sample data source.
               * 
               
          */

              
          public SampleData3() {
                  data 
          = new Object[][] {
                          
          "Mr. Black""1666 Pennsylvania Ave.""012345 Washington",
                                  
          "01212""Robert A. Heinlein - Starship Trooper",
                                  
          new Integer(1), new Double(12.49) }
          ,
                          
          "Mr. Black""1666 Pennsylvania Ave.""012345 Washington",
                                  
          "01231""Robert A. Heinlein - Glory Road",
                                  
          new Integer(1), new Double(12.99) }
          ,
                          
          "Mr. Black""1666 Pennsylvania Ave.""012345 Washington",
                                  
          "12121""Frank Herbert - Dune"new Integer(1),
                                  
          new Double(10.99) }
          ,
                          
          "Mr. Black""1666 Pennsylvania Ave.""012345 Washington",
                                  
          "A1232""Bierce Ambrose - The Devils Dictionary",
                                  
          new Integer(2), new Double(19.99) }
          ,
                          
          "John F. Google""12a Nowaday Road""99999 Boston",
                                  
          "12333""Samuel Adams - How to sell tea ",
                                  
          new Integer(100), new Double(10.99) }
          ,
                          
          "John F. Google""12a Nowaday Road""99999 Boston",
                                  
          "88812""Adam Smith - The wealth of nations",
                                  
          new Integer(1), new Double(49.95) }
          ,
                          
          "John F. Google""12a Nowaday Road""99999 Boston",
                                  
          "33123""D. Khan - How to conquer friends",
                                  
          new Integer(1), new Double(15.99) }
          ,
                          
          "John F. Google""12a Nowaday Road""99999 Boston",
                                  
          "33123""D. Khan - How to conquer friends",
                                  
          new Integer(1), new Double(19.49) }
          ,
                          
          "Cleeve Johnson""87 Oakham Drive""99999 Boston""33123",
                                  
          "D. Khan - How to conquer friends"new Integer(1),
                                  
          new Double(15.99) }
          ,
                          
          "Cleeve Johnson""87 Oakham Drive""99999 Boston""33123",
                                  
          "J. Ceaser - Choosing the right friends",
                                  
          new Integer(1), new Double(25.99) }
          ,
                          
          "Cleeve Johnson""87 Oakham Drive""99999 Boston""33123",
                                  
          "Galileo - When to tell the truth"new Integer(1),
                                  
          new Double(29.59) }
           }
          ;
              }


              
          /**
               * Returns the number of rows in the table model.
               * 
               * 
          @return the row count.
               
          */

              
          public int getRowCount() {
                  
          return data.length;
              }


              
          /**
               * Returns the number of columns in the table model.
               * 
               * 
          @return the column count.
               
          */

              
          public int getColumnCount() {
                  
          return 8;
              }


              
          /**
               * Returns the name of the specified column.
               * 
               * 
          @param column
               *            the column (zero-based index).
               * 
               * 
          @return the column name.
               
          */

              
          public String getColumnName(final int column) {
                  
          if (column == 0{
                      
          return "name";
                  }
           else if (column == 1{
                      
          return "street";
                  }
           else if (column == 2{
                      
          return "town";
                  }
           else if (column == 3{
                      
          return "productcode";
                  }
           else if (column == 4{
                      
          return "productname";
                  }
           else if (column == 5{
                      
          return "count";
                  }
           else if (column == 6{
                      
          return "price";
                  }
           else if (column == 7{
                      
          return "total";
                  }
           else {
                      
          return null;
                  }

              }


              
          /**
               * Returns the data value at the specified row and column.
               * 
               * 
          @param row
               *            the row index (zero based).
               * 
          @param column
               *            the column index (zero based).
               * 
               * 
          @return the value.
               
          */

              
          public Object getValueAt(final int row, final int column) {
                  
          if (column == 7{
                      
          final Integer i = (Integer) data[row][5];
                      
          final Double d = (Double) data[row][6];
                      
          return new Double(i.intValue() * d.doubleValue());
                  }
           else {
                      
          return data[row][column];
                  }

              }


          }

          4   中文亂碼問題

          大家在參看報表定義文件的時候會發現,里面的報表頭定義中有一些顯示內容,如果你直接將他修改成中文,顯示在報表上就會亂碼,這是因為這些報表定義文件都是XML文檔,他的encoding默認設置是ISO-8859-1,所以出現了中文亂碼的問題,解決辦法有兩個:


          1.最簡單的方法就是將encoding的設置修改為GB2312


          2.還有一個方法就是不修改encoding的設置,而是將這些中文內容使用他們的unicode碼來代替。


          [注] 作者提供了一個GUI的界面提供這種轉化功能,你只需要輸入中文就可以獲得對應的unicode碼,請大家下載作者提供的gb2unicode.jar,設置好java運行環境,然后執行java -jar gb2unicode.jar就可以了。


          5   總結

          報表問題是企業信息化中比較關注的一個焦點,也比較難于實現客戶化,作者在本文中給大家介紹了一個新的報表生成包-JfreeReport,他可以根據XML文檔中定義的報表格式,生成符合客戶要求的報表。文章中給出了2個簡單的例子,演示了如何使用JFreeReport生成報表的詳細步驟,希望能夠幫助大家熟悉JFreeReport的工作方式。同時文章中給出了使用JFreeReport過程中可能遇到的中文問題的解決辦法。

          其實JFreeReport還支持在JSP、Servlet中顯示報表,只是還需要用到他的擴展組件,作者這里沒有給出例子,大家可以參考下載的JFreeReport的擴展組件中的例子。

          參考資料:

          JFreeReport 在線幫助文檔 http://www.jfree.org/jfreereport/index.html

          JFreeReport 的JavaDoc http://www.jfree.org/jfreereport/javadoc/index.html

          posted on 2009-10-26 21:35 飛翔天使 閱讀(3307) 評論(0)  編輯  收藏 所屬分類: jfreereport

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 大同县| 莱芜市| 东辽县| 天祝| 天长市| 独山县| 雷山县| 湘潭市| 万州区| 兴安县| 嘉定区| 泽州县| 班玛县| 日照市| 屯留县| 蓝山县| 苏尼特右旗| 增城市| 卢龙县| 谷城县| 吉隆县| 新乡县| 勐海县| 溧水县| 庐江县| 临沭县| 恩平市| 民县| 措美县| 曲麻莱县| 通州市| 滨海县| 微山县| 平原县| 舒城县| 航空| 仲巴县| 紫金县| 桦南县| 南和县| 疏附县|