我去年在開發一個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 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();
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 }
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 }
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 }
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>
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>