FineReport應用 - 程序網絡報表Hello,World | #報表

什麼是程序網絡報表

  FineReport設計器基本可以零編碼地設計出絕大多數報表,然而這種方式建立的報圾需要依賴於設計器及報表模板,在一些有特殊需求的場合並不適用,這時候就需要通過編程的方式來設計報表並在J2EE服務器上預覽。

 

Reportlet接口

  FineReport API提供了豐富的接口使用戶可以靈活得設計報表,其中Reportlet接口對程序網絡報表提供了支持。

 

package com.fr.web;

import com.fr.report.ReportTemplate;

public abstract interface Reportlet {
    public abstract ReportTemplate createReport(
            ReportletRequest paramReportletRequest) throws ReportletException;
}

 

  createReport()方法返回一個報表模板對象供報表服務器渲染,實現Reportlet接口並實現此方法,即可以建立一個程序網絡報表。

 

Hello,World!

  我們將通過編程的方法,製作一張在A1單元格顯示紅色Hello,World!文本的報表,並在服務器上預覽。

 

  一、建立一個實現Reportlet接口的類。

 

  建立一個名爲HelloReport的類,使之實現Reportlet接口,並實現createReport方法。Reportlet接口中只有一個方法,該方法會返回一個ReportTemplate實例。

 

package fr.report;

import com.fr.report.ReportTemplate;
import com.fr.web.Reportlet;
import com.fr.web.ReportletException;
import com.fr.web.ReportletRequest;

public class HelloReportlet implements Reportlet {

    @Override
    public ReportTemplate createReport(ReportletRequest arg0)
            throws ReportletException {
        // TODO Auto-generated method stub
        return null;
    }

}

 

  二、爲createReport方法創建ReportTemplate實例並返回。

 

  1. 建立WorkSheet並返回。

 

  com.fr.report.ReportTemplate是一個接口,它定義了報表模板的通用行爲,本例中我們使用它的實現類 com.fr.report.WorkSheet。WorkSheet即工作表,用於對報表進行佈局和美化,由具有不同功能的單元格組成。

 

@Override
public ReportTemplate createReport(ReportletRequest arg0)
        throws ReportletException {
    WorkSheet worksheet = new WorkSheet();
    
    return worksheet;
}

 

  2. 在A1建立文本型單元格並添加到報表中。


  com.fr.report.CellElement規定的單元格元素應該具有的基本行爲,這裏我們使用它的實現類 com.fr.report.DefaultCellElement來建立一個文本類型的單元格。

 

  通過構造器DefaultCellElement(int column, int row, java.lang.Object value)可以構造一個指定座標和值的單元格,根據參數value類型的不同來爲單元格提供不同的形態和行爲,如果傳如String型參數,會構造一個文本單元格。

 

CellElement cellElem = new DefaultCellElement(0, 0, "Hello, World!");
worksheet.addCellElement(cellElem);

 

  還可以傳入Formula、DSColumn等類型構造公式、數據列型的單元格。

  3. 爲單元格設置樣式。

  樣式的設置比較繁瑣,需要使用到com.fr.base.Style類及com.fr.base.FRFont,官方文檔中的方法是這樣的。

 

// 創建樣式
Style style = Style.getInstance();
// 創建字體
FRFont frFont = FRFont.getInstance("Tahoma", Font.BOLD | Font.ITALIC, 20);
// 設置字體爲紅色
frFont = frFont.applyForeground(Color.RED);
// 應用字體到樣式
style = style.deriveFRFont(frFont);
// 應用樣式到單元格
cellElem.setStyle(style);

 

  其中applyForground()方法和deriveFRFont()方法與一般習慣不同,它並對對象進行修改,而是返回一個應用了前景色(或字體) 的新對象。所以需要重新給引用賦值 a = a.doXXX() 以保證更新。其實我們可以用一些便捷的方法。

 

// 創建並應用樣式
Style style = Style.getInstance(FRFont.getInstance("Tahoma", 
        Font.BOLD | Font.ITALIC, 20, Color.RED));
// 應用樣式到單元格
cellElem.setStyle(style);

 

  3. 設置行高和列寬。


  因爲行高和列寬會影響到整行或整列,所以它們是工作表的行爲,而非單元格。

 

// 設置行高和列寬
worksheet.setRowHeight(0, 30);
worksheet.setColumnWidth(0, 200);

 

   完整代碼:

 

package fr.report;

import java.awt.Color;
import java.awt.Font;

import com.fr.base.FRFont;
import com.fr.base.Style;
import com.fr.report.CellElement;
import com.fr.report.DefaultCellElement;
import com.fr.report.ReportTemplate;
import com.fr.report.WorkSheet;
import com.fr.web.Reportlet;
import com.fr.web.ReportletException;
import com.fr.web.ReportletRequest;

/**   
 * 程序網絡報表 - Hello, World!
 * http://localhost:9527/FineReport/ReportServer?reportlet=fr.report.HelloReportlet
 * 
 * @author GreatGhoul 
 */ 
public class HelloReportlet implements Reportlet {

    @Override
    public ReportTemplate createReport(ReportletRequest arg0)
            throws ReportletException {
        // 建立報表
        WorkSheet worksheet = new WorkSheet();
        
        // 在A1建立單元格
        CellElement cellElem = new DefaultCellElement(0, 0, "Hello, World!");
        
        // 創建並應用樣式
        Style style = Style.getInstance(FRFont.getInstance("Tahoma", 
                Font.BOLD | Font.ITALIC, 20, Color.RED));
        // 應用樣式到單元格
        cellElem.setStyle(style);
        
        // 設置行高和列寬
        worksheet.setRowHeight(0, 30);
        worksheet.setColumnWidth(0, 200);
        
        // 將單元格加入到報表中
        worksheet.addCellElement(cellElem);
        
        return worksheet;
    }

}

 

預覽程序網絡報表

  要預覽報表,只需要將編譯後的.class文件放在報表服務器classes文件夾下,然後就可以通過如下形式的地址訪問報表了。

 

  http://<報表服務器地址>/ReportServer?reportlet=<實現了Reportlet的類的全限定名& gt;


  本例中,Reportlet的全限定名爲fr.report.HelloReportlet

 

  http://localhost:9527/FineReport/ReportServer?reportlet=fr.report.HelloReportlet

 

  效果如下圖:

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章