什麼是程序網絡報表
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
效果如下圖: