posts - 297,  comments - 1618,  trackbacks - 0
          原文地址:http://hi.baidu.com/whoqiaoyu/blog/item/07e6cb503eb3395e1038c299.html

          文章摘要


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


          關(guān)鍵詞


          JFreeReport   報(bào)表生成   預(yù)覽


          報(bào)表生成一直是企業(yè)信息化過程中重要的一環(huán),也是目前比較難于實(shí)現(xiàn)的一環(huán),今天作者給大家介紹一種新的報(bào)表生成組件――JFreeReport。JFreeReport是JFreeReport.Org基于LGPL授權(quán)協(xié)議提供的一組java包,用于生成各類報(bào)表,JFreeReport的數(shù)據(jù)繼承自Swing組件的TableModel接口,使用基于XML的報(bào)表格式定義文件對(duì)報(bào)表進(jìn)行格式化。JFreeReport生成的報(bào)表可以分頁(yè)預(yù)覽、打印,而且支持導(dǎo)出為多種格式的文件如pdf、Excel、CSV、html等。更重要的是,JFreeReport不僅支持基于C/S結(jié)構(gòu)的系統(tǒng),而且支持基于B/S結(jié)構(gòu)的系統(tǒng)中的在線報(bào)表顯示。更詳細(xì)的關(guān)于JFreeReport的介紹請(qǐng)大家訪問JFreeReport的官方網(wǎng)站JFree.org

          1   環(huán)境準(zhǔn)備

          1.1   JFreeReport組件

          請(qǐng)大家到http://prdownloads.sourceforge.net/jfreereport/jfreereport-0.8.4_7.zip?download下載JFreeReport組件,下載的是一個(gè)ZIP文件,然后將ZIP文件解壓縮到c:\jfreereport(后面的章節(jié)中將使用%jfreereport_home%表示這個(gè)目錄)目錄下。

          1.2   JFreeReport擴(kuò)展組件

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

          1.3   Ant工具

          Apache公司提供的一個(gè)基于JAVA的自動(dòng)化腳本引擎,請(qǐng)大家到http://ant.apache.org/下載ant的可執(zhí)行文件,關(guān)于如何使用ant請(qǐng)大家查看ant的幫助文檔或者http://ant.apache.org/網(wǎng)站上的在線幫助文檔。示例中主要是用ant來負(fù)責(zé)編譯java代碼。

          1.4   作者提供的代碼


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

          2   JFreeReport生成報(bào)表的基本步驟


          我們首先演示一個(gè)簡(jiǎn)單的例子,說明使用JFreeReport生成報(bào)表的一些必要的步驟。

          2.1   實(shí)例說明


          在這個(gè)例子中,我們將循環(huán)生成100條數(shù)據(jù)放入TableModel中,然后使用JFreeReport組件提供的預(yù)覽功能在屏幕上顯示生成的報(bào)表。

          [注] 為了簡(jiǎn)化,這里僅僅是逐條顯示數(shù)據(jù),不作任何修飾和統(tǒng)計(jì)工作,所以也不使用報(bào)表格式定義文件。

          2.2   代碼編制


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

          /**
          * HelloWorld.java
          */

          package 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生成報(bào)表的簡(jiǎn)單例子,用于演示使用JFreeReport生成報(bào)表的一些基本步驟
          *
          * 本例子中,為了簡(jiǎn)化操作,報(bào)表定義是使用java直接編碼
          *
          * @ 作者 : bookman
          */
          public class HelloWorld
          {
             /**
              * 處理窗口關(guān)閉事件
              */
             protected static class CloseHandler extends WindowAdapter
             {
               public void windowClosing(final WindowEvent event)
               {
                 System.exit(0);
               }
             }

             /**
              * 創(chuàng)建和顯示簡(jiǎn)單的報(bào)表
              */
             public HelloWorld()
             {
          // 獲得創(chuàng)建報(bào)表需要用到的數(shù)據(jù)
               final TableModel data = createData();
          //獲得報(bào)表要用到的報(bào)表定義內(nèi)容
               final JFreeReport report = createReportDefinition();
          //將報(bào)表定義和數(shù)據(jù)結(jié)合
               report.setData(data);
               try
               {
              //將生成的報(bào)表放到預(yù)覽窗口中
                 final PreviewDialog preview = new PreviewDialog(report);
                 preview.addWindowListener(new CloseHandler());
                 preview.pack();
              //顯示報(bào)表預(yù)覽窗口
                 preview.setVisible(true);
               }
               catch (ReportProcessingException e)
               {
                 System.out.println(e);
               }

             }

             /**
              * 創(chuàng)建生成報(bào)表需要用到的數(shù)據(jù)
              *
              * @返回一個(gè)TableModel實(shí)例
              */
             private TableModel createData()
             {

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

               return result;

             }

             /**
              * 創(chuàng)建一個(gè)報(bào)表定義
              *
              * @返回一個(gè)報(bào)表定義實(shí)例
              */
             private JFreeReport createReportDefinition()
             {

               final JFreeReport report = new JFreeReport();
               report.setName("A Very Simple Report");
          /**
              * 定義要顯示報(bào)表第一列的樣式
             */
               TextFieldElementFactory factory = new TextFieldElementFactory();
               factory.setName("T1");
               factory.setAbsolutePosition(new Point2D.Float(0, 0));
               factory.setMinimumSize(new FloatDimension(150, 20));
               factory.setColor(Color.black);
               factory.setHorizontalAlignment(ElementAlignment.LEFT);
               factory.setVerticalAlignment(ElementAlignment.MIDDLE);
               factory.setNullString("-");
               factory.setFieldname("Column1");
               report.getItemBand().addElement(factory.createElement());
          /**
              * 定義要顯示報(bào)表第二列的樣式
             */
               factory = new TextFieldElementFactory();
               factory.setName("T2");
               factory.setAbsolutePosition(new Point2D.Float(200, 0));
               factory.setMinimumSize(new FloatDimension(150, 20));
               factory.setColor(Color.black);
               factory.setHorizontalAlignment(ElementAlignment.LEFT);
               factory.setVerticalAlignment(ElementAlignment.MIDDLE);
               factory.setNullString("-");
               factory.setFieldname("Column2");
               report.getItemBand().addElement(factory.createElement());
          /**
              * 返回一個(gè)報(bào)表定義的實(shí)例
             */
               return report;

             }

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

               //調(diào)用演示實(shí)例
               new HelloWorld();
             }

          }


          2.3   運(yùn)行例子


          如果你執(zhí)行了1.3中規(guī)定的步驟,你可以進(jìn)入命令行界面,然后進(jìn)入%demo_home%目錄下,修改setenv.cmd中的相關(guān)設(shè)置,執(zhí)行serenv.cmd設(shè)置環(huán)境變量。執(zhí)行java org.vivianj.jfreereport.HelloWorld查看運(yùn)行結(jié)果。下面這個(gè)圖片是作者執(zhí)行后結(jié)果的屏幕截圖:



          大家可以看到,JFreeReport已經(jīng)自動(dòng)幫我們實(shí)現(xiàn)了分頁(yè)。上面這個(gè)圖片顯示的是第一頁(yè)的數(shù)據(jù),你可以通過工具欄中的查看其它頁(yè)面中的內(nèi)容。


          2.4   基本步驟解釋


          使用JFreeReport生成報(bào)表通常需要以下三個(gè)基本步驟:



          1. 生成可通過TableModel接口訪問的數(shù)據(jù),如本例中的createData方法完成的功能
          2. 生成一個(gè)JFreeReport實(shí)例,他定義了我們?nèi)绾胃袷交@示數(shù)據(jù),如本例中的createReportDefinition方法完成的功能
          3. 將數(shù)據(jù)和JFreeReport實(shí)例連接起來,并且將該JFreeReport實(shí)例傳給PreviewDialog的一個(gè)實(shí)例顯示給用戶


          3   使用JFreeReport生成復(fù)雜報(bào)表

          3.1   報(bào)表定義文件

          報(bào)表定義文件是JFreeReport生成復(fù)雜報(bào)表的重要文件,他就是一個(gè)XML文檔,主要描述如何使用指定的格式生成復(fù)雜的報(bào)表,同時(shí)使用報(bào)表定義文件也可以在報(bào)表格式需要修改時(shí)只需要更新該報(bào)表定義文件,而不需要修改應(yīng)用代碼。

          3.1.1   報(bào)表定義文件分類

          JFreeReport中使用了兩種基于XML的報(bào)表定義文件來保存報(bào)表定義信息:簡(jiǎn)單格式和擴(kuò)展格式.很明顯,簡(jiǎn)單格式不能夠完全的描述JFreeReport支持的全部報(bào)表定義信息,但是他更易于上手使用。而擴(kuò)展格式則能夠?qū)FreeReport的報(bào)表定義提供完整的支持,但是擴(kuò)展格式太詳細(xì)了,不太容易使用。

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

          3.2   代碼編制

          這個(gè)例子和2.2中的代碼基本一致,只是報(bào)表定義內(nèi)容不再由java編碼實(shí)現(xiàn),而是由報(bào)表定義文件提供,所以調(diào)用方面稍微有點(diǎn)不同,詳細(xì)的代碼如下,請(qǐng)大家注意其中加粗顯示的部分:

          /**
          * JFreeReport.java
          */

          package org.vivianj.jfreereport;

          import java.io.File;
          import java.text.MessageFormat;
          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;

          import org.vivianj.jfreereport.tablemodel.SampleData;

          /**
          * 使用JFreeReport生成復(fù)雜報(bào)表的例子,
          * 用于演示使用JFreeReport生成復(fù)雜報(bào)表的一些基本步驟
          *
          * 本例子中,報(bào)表定義使用了報(bào)表定義文件,該文件是保存在c:\下的report3.xml文件
          * 本例中使用的報(bào)表定義使用了簡(jiǎn)單報(bào)表定義格式
          *
          * @ 作者 : bookman
          */
          public class JFreeTest
          {

          public JFreeTest(final String urlname, final TableModel data)
             {
          //創(chuàng)建對(duì)報(bào)表定義文件的引用
               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
               {
                 //從報(bào)表定義文件中獲得要用到的報(bào)表定義內(nèi)容
                 final JFreeReport report1 = gen.parseReport(in);
                 if (report1 == null)
                 {
                   System.out.print(" report1 is null");
                   return;
                 }
                 //將報(bào)表定義和數(shù)據(jù)結(jié)合
                 report1.setData(data);
              //將生成的報(bào)表放到預(yù)覽窗口中
                 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 SampleData();
             JFreeTest jft = new JFreeTest("c:\\report3.xml",data3);
          }
          }


          4   中文亂碼問題

          大家在參看報(bào)表定義文件的時(shí)候會(huì)發(fā)現(xiàn),里面的報(bào)表頭定義中有一些顯示內(nèi)容,如果你直接將他修改成中文,顯示在報(bào)表上就會(huì)亂碼,這是因?yàn)檫@些報(bào)表定義文件都是XML文檔,他的encoding默認(rèn)設(shè)置是ISO-8859-1,所以出現(xiàn)了中文亂碼的問題,解決辦法有兩個(gè):


          1.最簡(jiǎn)單的方法就是將encoding的設(shè)置修改為GB2312


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


          [注] 作者提供了一個(gè)GUI的界面提供這種轉(zhuǎn)化功能,你只需要輸入中文就可以獲得對(duì)應(yīng)的unicode碼,請(qǐng)大家下載作者提供的gb2unicode.jar,設(shè)置好java運(yùn)行環(huán)境,然后執(zhí)行java -jar gb2unicode.jar就可以了。


          5   總結(jié)

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

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

          參考資料

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

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

          posted on 2007-11-15 14:16 阿蜜果 閱讀(2001) 評(píng)論(0)  編輯  收藏 所屬分類: JFreeReport
          <2007年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

                生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊(cè)

          關(guān)注blog

          積分與排名

          • 積分 - 2296321
          • 排名 - 3

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 茂名市| 古交市| 财经| 格尔木市| 汪清县| 临安市| 仁寿县| 高密市| 醴陵市| 朝阳县| 汕尾市| 新营市| 兰西县| 鄂托克前旗| 旌德县| 林西县| 本溪| 桦甸市| 崇礼县| 长阳| 马山县| 乌拉特中旗| 葫芦岛市| 长治市| 侯马市| 塘沽区| 钟山县| 武义县| 永靖县| 长顺县| 肥西县| 衡南县| 买车| 旌德县| 盐亭县| 清涧县| 东莞市| 三河市| 东乌珠穆沁旗| 商水县| 平顺县|