隨筆-193  評論-715  文章-1  trackbacks-0
          JFreeReport是一個非常不錯的開源的東東,更多詳細的關于此東東的基礎性和相關介紹請參考其官方網站(http://www.jfree.org/jfreereport/)。

          我去年在開發一個SWING的應用系統的時候就是使用JFreeReport來處理的報表問題。它同時還支持將報表輸出為PDF,XSL等格式,功能之強大讓我覺得值得去研究和關注她。

          JFreeReport主要有兩種生成報表的形式,一種是在程序中直接生成,當然這種方式肯定不利于維護和修改,同時在程序中生成報表也比較麻煩,網上有相關的文章介紹,大家可以去百度或是GOOGLE一下,在此就不再冗述了。

          第二種方法就是通過程序+XML配置文件的方法來控制報表的格式。主要分為如下幾個步驟來實現:

          1、導入相關的包和類
          1 import org.jfree.report.JFreeReport;
          2 import org.jfree.report.ReportProcessingException;
          3 import org.jfree.report.modules.gui.base.PreviewFrame;
          4 import org.jfree.report.modules.gui.base.components.ActionButton;
          5 import org.jfree.report.modules.gui.base.components.ActionMenuItem;
          6 import org.jfree.report.modules.parser.base.ReportGenerator;
          7 import org.jfree.report.util.Log;
          8 import org.jfree.report.util.WaitingImageObserver;
          9 import org.jfree.report.modules.gui.base.PreviewDialog;

          2、將數據放入一個TableModel中
          1 JTable jt=new JTable(aaa,v);
          2 // 獲得創建報表需要用到的數據
          3 sdata=jt.getModel();

          3、讀入報表格式控制文件(即相應的XML文件)
           1 try {
           2       if (report == null) {
           3         URL in = getClass().getResource("/zmx/chosun/ScorePrintNew.xml");
           4         this.report = parseReport(in);
           5       }
           6       if (report == null) {
           7         JOptionPane.showMessageDialog(new JFrame(), "The report definition is null");
           8         return;
           9       }
          10     }
          11     catch (Exception e) {
          12       e.printStackTrace();
          13     }

          4、將報表和數據結合起來
          1 this.report.setData(sdata);

          5、調用并打開預覽窗口
           1     try {
           2       //將生成的報表放到預覽窗口中
           3      final PreviewDialog preview = new PreviewDialog(report);
           4       preview.addWindowListener(new WindowAdapter() {
           5         public void windowClosing(final WindowEvent event) {
           6           preview.dispose();
           7         }
           8 
           9       });
          10       preview.pack();
          11       //顯示報表預覽窗口
          12       preview.setVisible(true);
          13     }
          14     catch (ReportProcessingException e) {
          15       System.out.println(e);
          16     }

          6、OK,大功告成。

          關于XML的報表格式控制文件的編寫我將會在后續的文章中詳細講解。
          歡迎大家批評指正!



          本程序源代碼如下:
            1 import javax.swing.table.TableModel;
            2 import com.borland.dx.sql.dataset.*;
            3 import javax.swing.*;
            4 import com.borland.dbswing.*;
            5 import java.awt.event.WindowAdapter;
            6 import java.awt.event.WindowEvent;
            7 import java.net.URL;
            8 import java.awt.print.Paper;
            9 import java.awt.print.PageFormat;
           10 import java.awt.*;
           11 import java.sql.Statement;
           12 import java.sql.ResultSet;
           13 import java.util.Vector;
           14 
           15 
           16 
           17 import org.jfree.report.JFreeReport;
           18 import org.jfree.report.ReportProcessingException;
           19 import org.jfree.report.modules.gui.base.PreviewFrame;
           20 import org.jfree.report.modules.gui.base.components.ActionButton;
           21 import org.jfree.report.modules.gui.base.components.ActionMenuItem;
           22 import org.jfree.report.modules.parser.base.ReportGenerator;
           23 import org.jfree.report.util.Log;
           24 import org.jfree.report.util.WaitingImageObserver;
           25 import org.jfree.report.modules.gui.base.PreviewDialog;
           26 
           27 
           28 public class ScorePrint{
           29   public TableModel sdata=null;
           30   JFreeReport report = null;
           31   Database database = new Database();
           32   QueryDataSet queryDataSet = new QueryDataSet();
           33   JPanel jPanel1 = new JPanel();
           34   TableScrollPane tableScrollPane1 = new TableScrollPane();
           35   JdbTable jdbTable1 = new JdbTable();
           36 
           37 
           38   public ScorePrint() {
           39     try {
           40       jbInit();
           41     }
           42     catch(Exception e) {
           43       e.printStackTrace();
           44     }
           45   }
           46 
           47   private void jbInit() throws Exception {
           48     database.setConnection(new com.borland.dx.sql.dataset.ConnectionDescriptor("jdbc:odbc:zhong"""""false"sun.jdbc.odbc.JdbcOdbcDriver"));
           49     Statement stmt=database.getJdbcConnection().createStatement();
           50 
           51     ResultSet rs=stmt.executeQuery("select bmxh,xm,chd,chw,mad,maw,[end],enw,phd,phw,pod,pow,totd from bmk order by bydm,bmxh");
           52 
           53     Vector v=new Vector();
           54     Vector aaa=new Vector();
           55     v.add("bmxh");
           56     v.add("xm");
           57     v.add("chd");
           58     v.add("chw");
           59     v.add("mad");
           60     v.add("maw");
           61     v.add("end");
           62     v.add("enw");
           63     v.add("phd");
           64     v.add("phw");
           65     v.add("pod");
           66     v.add("pow");
           67     v.add("totd");
           68     while(rs.next()){
           69       Vector vv=new Vector();
           70       vv.add(rs.getString(1));
           71       vv.add(rs.getString(2));
           72       vv.add(rs.getString(3));
           73       vv.add(new Integer(rs.getInt(4)).toString());
           74       vv.add(rs.getString(5));
           75       vv.add(new Integer(rs.getInt(6)).toString());
           76       vv.add(rs.getString(7));
           77       vv.add(new Integer(rs.getInt(8)).toString());
           78       vv.add(rs.getString(9));
           79       vv.add(new Integer(rs.getInt(10)).toString());
           80       vv.add(rs.getString(11));
           81       vv.add(new Integer(rs.getInt(12)).toString());
           82       vv.add(new Integer(rs.getInt("totd")).toString());
           83       aaa.add(vv);
           84     }
           85   JTable jt=new JTable(aaa,v);
           86 
           87 
           88     // 獲得創建報表需要用到的數據
           89     sdata=jt.getModel();
           90 
           91     //獲得報表要用到的報表定義內容
           92 
           93     try {
           94       if (report == null) {
           95         URL in = getClass().getResource("/zmx/chosun/ScorePrintNew.xml");
           96         this.report = parseReport(in);
           97       }
           98       if (report == null) {
           99         JOptionPane.showMessageDialog(new JFrame(), "The report definition is null");
          100         return;
          101       }
          102     }
          103     catch (Exception e) {
          104       e.printStackTrace();
          105     }
          106 
          107    
          117 
          118 
          119     //將報表定義和數據結合
          120     this.report.setData(sdata);
          121 
          122  
          123     try {
          124       //將生成的報表放到預覽窗口中
          125      final PreviewDialog preview = new PreviewDialog(report);
          126       preview.addWindowListener(new WindowAdapter() {
          127         public void windowClosing(final WindowEvent event) {
          128           preview.dispose();
          129         }
          130 
          131       });
          132       preview.pack();
          133       //顯示報表預覽窗口
          134       preview.setVisible(true);
          135     }
          136     catch (ReportProcessingException e) {
          137       System.out.println(e);
          138     }
          139 
          140 
          141 
          142 
          143 
          144    }
          145 
          146    JFreeReport parseReport(URL templateURL) {
          147 
          148      JFreeReport result = null;
          149      ReportGenerator generator = ReportGenerator.getInstance();
          150      try {
          151        result = generator.parseReport(templateURL);
          152      }
          153      catch (Exception e) {
          154        Log.error("Failed to parse the report definition", e);
          155      }
          156      return result;
          157 
          158    }
          159 
          160 
          161 }

          本程序使用XML文件如下:
           1 <?xml version="1.0" encoding="GBK"?>
           2 <!DOCTYPE report PUBLIC "-//JFreeReport//DTD report definition//EN//simple"
           3                         "http://jfreereport.sourceforge.net/report.dtd">
           4 <report name="成績打印" pageformat="A4" leftmargin="20" topmargin="20" >
           5 
           6   <!-- REPORT HEADER -->
           7   <!-- This band appears once at the beginning of the report.  In this example, -->
           8   <!-- the header contains four labels. -->
           9   <configuration>
          10     <property name="org.jfree.report.modules.output.pageable.pdf.Encoding">Identity-H</property>
          11     <property name="org.jfree.report.modules.output.pageable.pdf.EmbedFonts">true</property>
          12     <property name="org.jfree.report.targets.table.TableWriter.SheetNameFunction">sheetNameExpression</property>
          13   </configuration>
          14 
          15     <pagefooter height="14"
          16     onfirstpage="true" onlastpage="true"
          17     fontname="宋體" fontstyle="plain" fontsize="9">
          18     <string-field fieldname="PageNumber" x="0" y="2" width="100%" height="12" alignment="center"/>
          19 
          20 
          21   </pagefooter>
          22 
          23   <groups height="55">
          24     <group name="bmxh">
          25       <groupheader height="22" fontname="SansSerif" fontstyle="plain" fontsize="11" pagebreak="false">
          26     <label x="0" y="10" width="100%" height="11" fontsize="11" alignment="left"
          27       >報   名   號     姓  名    語文 位置值  數學 位置值  英語 位置值  理化 位置值  政史 位置值   總位置值</label>
          28 
          29       </groupheader>
          30       <fields>
          31         <field>bmxh</field>
          32       </fields>
          33         <groupfooter height="5" fontstyle="plain" fontsize="11" pagebreak="false">
          34         <line x1="0" y1="5" x2="0" y2="5" color="#CFCFCF" weight="0.5"/>
          35       </groupfooter>
          36     </group>
          37   </groups>
          38 
          39   <!-- THE ITEM BAND -->
          40   <!-- This band is printed once for each row of data in the TableModel. -->
          41   <items height="0" fontname="SansSerif" fontstyle="plain" fontsize="11">
          42 
          43     <string-field x="0" y="1" width="80" height="12" alignment="left" fontname="宋體" fontsize="10"
          44       fieldname="bmxh"/>
          45     <string-field x="64" y="1" width="60" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          46       fieldname="xm"/>
          47     <string-field x="110" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          48       fieldname="chd"/>
          49     <string-field x="144" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          50       fieldname="chw"/>
          51     <string-field x="175" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          52       fieldname="mad"/>
          53     <string-field x="212" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          54       fieldname="maw"/>
          55     <string-field x="240" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          56       fieldname="end"/>
          57     <string-field x="273" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          58       fieldname="enw"/>
          59     <string-field x="305" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          60       fieldname="phd"/>
          61     <string-field x="339" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          62       fieldname="phw"/>
          63     <string-field x="370" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          64       fieldname="pod"/>
          65     <string-field x="405" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          66       fieldname="pow"/>
          67     <string-field x="450" y="1" width="40" height="12" alignment="left"  fontname="宋體" fontstyle="plain" fontsize="10"
          68       fieldname="totd"/>
          69 
          70 
          71 
          72 
          73   </items>
          74 
          75   <!-- FUNCTIONS -->
          76   <!-- Declares the functions used in this report. -->
          77  <functions>
          78 
          79     <function name="PageNumber" class="org.jfree.report.function.PageFunction">
          80     </function>
          81 
          82 
          83   </functions>
          84 
          85 </report>

          posted on 2006-02-28 11:51 Robin's Programming World 閱讀(3304) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 阿勒泰市| 武邑县| 宁德市| 大洼县| 宜宾县| 尉氏县| 大足县| 扎鲁特旗| 札达县| 衡东县| 博罗县| 蓬溪县| 玉溪市| 巫山县| 临湘市| 来安县| 金门县| 南康市| 苏尼特左旗| 杭锦旗| 佳木斯市| 滦平县| 象州县| 北海市| 霍邱县| 临安市| 谢通门县| 拜泉县| 新闻| 苍南县| 彭州市| 根河市| 渑池县| 礼泉县| 嘉兴市| 连江县| 屯昌县| 潮州市| 科技| 秀山| 灌南县|