報表生成一直是企業信息化過程中重要的一環,也是目前比較難于實現的一環,今天作者給大家介紹一種新的報表生成組件――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://prdownloads.sourceforge.net/jfreereport/jfreereport-0.8.4_7.zip?download下載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/看到這個文件。
/**
* 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
{
/**
* 處理窗口關閉事件
*/
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;
int colnum = 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(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();
//調用演示實例
new HelloWorld();
}
}
2.3 運行例子
假如你執行了1.3中規定的步驟,你可以進入命令行界面,然后進入%demo_home%目錄下,修改setenv.cmd中的相關設置,
執行serenv.cmd設置環境變量。執行java org.vivianj.jfreereport.HelloWorld查看運行結果。下面這個圖片是
作者執行后結果的屏幕截圖:
大家可以看到,JFreeReport已經自動幫我們實現了分頁。上面這個圖片顯示的是第一頁的數據,你可以通過工具欄中的查
看其它頁面中的內容。
2.4 基本步驟解釋
使用JFreeReport生成報表通常需要以下三個基本步驟:
生成可通過TableModel接口訪問的數據,如本例中的createData方法完成的功能
生成一個JFreeReport實例,他定義了我們如何格式化顯示數據,如本例中的createReportDefinition方法完成的功能
將數據和JFreeReport實例連接起來,并且將該JFreeReport實例傳給PreviewDialog的一個實例顯示給用戶
3 使用JFreeReport生成復雜報表
3.1 報表定義文件
報表定義文件是JFreeReport生成復雜報表的重要文件,他就是一個XML文檔,主要描述如何使用指定的格式生成復雜的報表,
同時使用報表定義文件也可以在報表格式需要修改時只需要更新該報表定義文件,而不需要修改應用代碼。
3.1.1 報表定義文件分類
JFreeReport中使用了兩種基于XML的報表定義文件來保存報表定義信息:簡單格式和擴展格式.很明顯,簡單格式不能夠完全
的描述JFreeReport支持的全部報表定義信息,但是他更易于上手使用。而擴展格式則能夠對JFreeReport的報表定義提供
完整的支持,但是擴展格式太具體了,不太輕易使用。
關于這兩種報表定義格式文件所
posted on 2008-04-02 19:32
Ke 閱讀(923)
評論(0) 編輯 收藏 所屬分類:
JFreereport