使用JFreeReport生成報表 文章摘要 JFreeReport用于生成報表。JFreeReport的數(shù)據(jù)繼承自Swing組件的TableModel接口,使用基于XML的報表格式定義文件對報表進行格式化。JFreeReport生成的報表可以分頁預(yù)覽、打印或者保存為多種格式的文件如pdf、Excel、html等。作者在本文中詳細(xì)的介紹了如何定義報表格式定義文件、如何使用JFreeReport生成/預(yù)覽報表和將報表轉(zhuǎn)為其它各種格式。 關(guān)鍵詞 JFreeReport 報表生成 預(yù)覽 報表生成一直是企業(yè)信息化過程中重要的一環(huán),也是目前比較難于實現(xiàn)的一環(huán),今天作者給大家介紹一種新的報表生成組件――JFreeReport。JFreeReport是JFreeReport.Org基于LGPL授權(quán)協(xié)議提供的一組java包,用于生成各類報表,JFreeReport的數(shù)據(jù)繼承自Swing組件的TableModel接口,使用基于XML的報表格式定義文件對報表進行格式化。JFreeReport生成的報表可以分頁預(yù)覽、打印,而且支持導(dǎo)出為多種格式的文件如pdf、Excel、CSV、html等。更重要的是,JFreeReport不僅支持基于C/S結(jié)構(gòu)的系統(tǒng),而且支持基于B/S結(jié)構(gòu)的系統(tǒng)中的在線報表顯示。更詳細(xì)的關(guān)于JFreeReport的介紹請大家訪問JFreeReport的官方網(wǎng)站JFree.org。 1 環(huán)境準(zhǔn)備 1.1 JFreeReport組件 請大家到http://prdownloads./jfreereport/jfreereport-0.8.4_7.zip?download下載JFreeReport組件,下載的是一個ZIP文件,然后將ZIP文件解壓縮到c:\jfreereport(后面的章節(jié)中將使用%jfreereport_home%表示這個目錄)目錄下。 1.2 JFreeReport擴展組件 請大家到http://www./jfreereport/jfreereport-ext-0.8.4_7.zip下載JFreeReport擴展組件,他用于支持JFreeReport組件生成的報表的在線顯示。請大載后解壓縮到c:\jfreereport-ext目錄下(后面的章節(jié)中將使用%jfreereport_ext_home%表示這個目錄) 1.3 Ant工具 Apache公司提供的一個基于JAVA的自動化腳本引擎,請大家到http://ant./下載ant的可執(zhí)行文件,關(guān)于如何使用ant請大家查看ant的幫助文檔或者http://ant./網(wǎng)站上的在線幫助文檔。示例中主要是用ant來負(fù)責(zé)編譯java代碼。 1.4 作者提供的代碼 為了運行本文中作者提到的例子和相關(guān)資源文件,請大家下載作者提供的vivianjDemo.zip文件和中文轉(zhuǎn)換工具gb2unicode.jar。然后解壓縮到%jfreereport_home%\vivianjDemo(后面的章節(jié)中將使用%demo _home%表示這個目錄)目錄下。 2 JFreeReport生成報表的基本步驟 我們首先演示一個簡單的例子,說明使用JFreeReport生成報表的一些必要的步驟。 2.1 實例說明 在這個例子中,我們將循環(huán)生成100條數(shù)據(jù)放入TableModel中,然后使用JFreeReport組件提供的預(yù)覽功能在屏幕上顯示生成的報表。 [注] 為了簡化,這里僅僅是逐條顯示數(shù)據(jù),不作任何修飾和統(tǒng)計工作,所以也不使用報表格式定義文件。 2.2 代碼編制 整個演示實例(HelloWorld.java)的代碼和相關(guān)注釋如下,如果你執(zhí)行了1.3中規(guī)定的步驟,你可以在%demo _home%/src/org/vivianj/jfreereport/看到這個文件。 /** * 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生成報表的簡單例子,用于演示使用JFreeReport生成報表的一些基本步驟 * * 本例子中,為了簡化操作,報表定義是使用java直接編碼 * * @ 作者 : bookman */ public class HelloWorld { /** * 處理窗口關(guān)閉事件 */ protected static class CloseHandler extends WindowAdapter { public void windowClosing(final WindowEvent event) { System.exit(0); } } /** * 創(chuàng)建和顯示簡單的報表 */ public HelloWorld() { // 獲得創(chuàng)建報表需要用到的數(shù)據(jù) final TableModel data = createData(); //獲得報表要用到的報表定義內(nèi)容 final JFreeReport report = createReportDefinition(); //將報表定義和數(shù)據(jù)結(jié)合 report.setData(data); try { //將生成的報表放到預(yù)覽窗口中 final PreviewDialog preview = new PreviewDialog(report); preview.addWindowListener(new CloseHandler()); preview.pack(); //顯示報表預(yù)覽窗口 preview.setVisible(true); } catch (ReportProcessingException e) { System.out.println(e); } } /** * 創(chuàng)建生成報表需要用到的數(shù)據(jù) * * @返回一個TableModel實例 */ 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)建一個報表定義 * * @返回一個報表定義實例 */ 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(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()); /** * 定義要顯示報表第二列的樣式 */ 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()); /** * 返回一個報表定義的實例 */ return report; } public static void main(final String[] args) { // 初始化JFreeReport Boot.start(); //調(diào)用演示實例 new HelloWorld(); } } 2.3 運行例子 如果你執(zhí)行了1.3中規(guī)定的步驟,你可以進入命令行界面,然后進入%demo_home%目錄下,修改setenv.cmd中的相關(guān)設(shè)置,執(zhí)行serenv.cmd設(shè)置環(huán)境變量。執(zhí)行java org.vivianj.jfreereport.HelloWorld查看運行結(jié)果。下面這個圖片是作者執(zhí)行后結(jié)果的屏幕截圖: 大家可以看到,JFreeReport已經(jīng)自動幫我們實現(xiàn)了分頁。上面這個圖片顯示的是第一頁的數(shù)據(jù),你可以通過工具欄中的 2.4 基本步驟解釋 使用JFreeReport生成報表通常需要以下三個基本步驟:
3 使用JFreeReport生成復(fù)雜報表 3.1 報表定義文件 報表定義文件是JFreeReport生成復(fù)雜報表的重要文件,他就是一個XML文檔,主要描述如何使用指定的格式生成復(fù)雜的報表,同時使用報表定義文件也可以在報表格式需要修改時只需要更新該報表定義文件,而不需要修改應(yīng)用代碼。 3.1.1 報表定義文件分類 JFreeReport中使用了兩種基于XML的報表定義文件來保存報表定義信息:簡單格式和擴展格式.很明顯,簡單格式不能夠完全的描述JFreeReport支持的全部報表定義信息,但是他更易于上手使用。而擴展格式則能夠?qū)FreeReport的報表定義提供完整的支持,但是擴展格式太詳細(xì)了,不太容易使用。 關(guān)于這兩種報表定義格式文件所支持的標(biāo)簽內(nèi)容以及如何編寫這兩種格式的報表定義文件請大家參考%jfreereport_home%下的jfreereport-0.8.3-A4.pdf中的相關(guān)部分,該文件附錄中還包括了這兩種格式的報表定義文件的DTD文檔供大家參考.當(dāng)然大家也JFreeReport的例子中提供了多種形式的報表定義文件,基本上涵蓋了常用的報表格式定義,大家可以參考這些例子編寫自己的報表定義文件,。 3.2 代碼編制 這個例子和2.2中的代碼基本一致,只是報表定義內(nèi)容不再由java編碼實現(xiàn),而是由報表定義文件提供,所以調(diào)用方面稍微有點不同,詳細(xì)的代碼如下,請大家注意其中加粗顯示的部分: /** * 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ù)雜報表的例子, * 用于演示使用JFreeReport生成復(fù)雜報表的一些基本步驟 * * 本例子中,報表定義使用了報表定義文件,該文件是保存在c:\下的report3.xml文件 * 本例中使用的報表定義使用了簡單報表定義格式 * * @ 作者 : bookman */ public class JFreeTest { public JFreeTest(final String urlname, final TableModel data) { //創(chuàng)建對報表定義文件的引用 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 { //從報表定義文件中獲得要用到的報表定義內(nèi)容 final JFreeReport report1 = gen.parseReport(in); if (report1 == null) { System.out.print(" report1 is null"); return; } //將報表定義和數(shù)據(jù)結(jié)合 report1.setData(data); //將生成的報表放到預(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 中文亂碼問題 大家在參看報表定義文件的時候會發(fā)現(xiàn),里面的報表頭定義中有一些顯示內(nèi)容,如果你直接將他修改成中文,顯示在報表上就會亂碼,這是因為這些報表定義文件都是XML文檔,他的encoding默認(rèn)設(shè)置是ISO-8859-1,所以出現(xiàn)了中文亂碼的問題,解決辦法有兩個: 1.最簡單的方法就是將encoding的設(shè)置修改為GB2312 2.還有一個方法就是不修改encoding的設(shè)置,而是將這些中文內(nèi)容使用他們的unicode碼來代替。 [注] 作者提供了一個GUI的界面提供這種轉(zhuǎn)化功能,你只需要輸入中文就可以獲得對應(yīng)的unicode碼,請大家下載作者提供的gb2unicode.jar,設(shè)置好java運行環(huán)境,然后執(zhí)行java -jar gb2unicode.jar就可以了。 5 總結(jié) 報表問題是企業(yè)信息化中比較關(guān)注的一個焦點,也比較難于實現(xiàn)客戶化,作者在本文中給大家介紹了一個新的報表生成包-JfreeReport,他可以根據(jù)XML文檔中定義的報表格式,生成符合客戶要求的報表。文章中給出了2個簡單的例子,演示了如何使用JFreeReport生成報表的詳細(xì)步驟,希望能夠幫助大家熟悉JFreeReport的工作方式。同時文章中給出了使用JFreeReport過程中可能遇到的中文問題的解決辦法。 其實JFreeReport還支持在JSP、Servlet中顯示報表,只是還需要用到他的擴展組件,作者這里沒有給出例子,大家可以參考下載的JFreeReport的擴展組件中的例子。 參考資料: JFreeReport 在線幫助文檔 http://www./jfreereport/index.html JFreeReport 的JavaDoc http://www./jfreereport/javadoc/index.html |
|