使用JFreeReport处理Java Swing编程中的报表问题
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 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 >