<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 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 飛翔天使 閱讀(3306) 評論(0)  編輯  收藏 所屬分類: jfreereport

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


    網站導航:
     
    主站蜘蛛池模板: 久久精品国产免费观看| 青青草a免费线观a| 国产卡二卡三卡四卡免费网址| 成人永久免费高清| 久久精品国产亚洲一区二区| 亚洲一线产区二线产区精华| 免费人成动漫在线播放r18| 99蜜桃在线观看免费视频网站| 成年女性特黄午夜视频免费看 | 日本一道本高清免费| 亚洲国产成人片在线观看| 亚洲综合精品伊人久久| 在线观看免费黄网站| 免费人成在线视频| 国产亚洲AV无码AV男人的天堂 | 中文字幕的电影免费网站| 在线永久免费的视频草莓| 亚洲国产精品尤物yw在线| 亚洲剧场午夜在线观看| 中文字幕永久免费| 免费黄色一级毛片| 亚洲图片一区二区| 国产JIZZ中国JIZZ免费看| 成熟女人牲交片免费观看视频| 亚洲国产第一页www| 成人久久久观看免费毛片| 最近免费中文字幕大全视频 | 精品一区二区三区免费视频| 成年性生交大片免费看| 亚洲视频一区在线| 中文永久免费观看网站| 免费A级毛片无码久久版| 亚洲丰满熟女一区二区v| 嫩草影院在线播放www免费观看| 免费国产在线观看不卡| 亚洲人xxx日本人18| 67194国产精品免费观看| 亚洲AV永久无码精品成人| 日日躁狠狠躁狠狠爱免费视频| 午夜色a大片在线观看免费| 亚洲理论片在线中文字幕|