什麼是程式網路報表 FineReport設計器基本可以零編碼地設計出絕大多數報表,然而這種方式建立的報圾需要依賴於設計器及報表範本,在一些有特殊需求的場合并不適用,這時候就需要通過編程的方式來設計報表並在J2EE伺服器上預覽。Reportlet介面 FineReport API提供了豐富的介面使使用者可以靈活得設計報表,其中Reportlet介面對程式網路報表提供了支援。package com.fr.web;<br />import com.fr.report.ReportTemplate;<br />public abstract interface Reportlet {<br /> public abstract ReportTemplate createReport(<br /> ReportletRequest paramReportletRequest) throws ReportletException;<br />} createReport()方法返回一個報表範本對象供報表伺服器渲染,實現Reportlet介面並實現此方法,即可以建立一個程式網路報表。 createReport()方法返回一個報表範本對象供報表伺服器渲染,實現Reportlet介面並實現此方法,即可以建立一個程式網路報表。Hello,World! 我們將通過編程的方法,製作一張在A1儲存格顯示紅色Hello,World!文本的報表,並在伺服器上預覽。 一、建立一個實現Reportlet介面的類。 建立一個名為HelloReport的類,使之實現Reportlet介面,並實現createReport方法。Reportlet介面中只有一個方法,該方法會返回一個ReportTemplate執行個體。 package fr.report;<br />import com.fr.report.ReportTemplate;<br />import com.fr.web.Reportlet;<br />import com.fr.web.ReportletException;<br />import com.fr.web.ReportletRequest;<br />public class HelloReportlet implements Reportlet {<br /> @Override<br /> public ReportTemplate createReport(ReportletRequest arg0)<br /> throws ReportletException {<br /> // TODO Auto-generated method stub<br /> return null;<br /> }<br />} 二、為createReport方法建立ReportTemplate執行個體並返回。 1. 建立WorkSheet並返回。 com.fr.report.ReportTemplate是一個介面,它定義了報表範本的通用行為,本例中我們使用它的實作類別com.fr.report.WorkSheet。WorkSheet即工作表,用於對報表進行布局和美化,由具有不同功能的儲存格組成。@Override<br />public ReportTemplate createReport(ReportletRequest arg0)<br /> throws ReportletException {<br /> WorkSheet worksheet = new WorkSheet();</p><p> return worksheet;<br />} 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!");<br />worksheet.addCellElement(cellElem); 還可以傳入Formula、DSColumn等類型構造公式、資料列型的儲存格。 3. 為儲存格設定樣式。 樣式的設定比較繁瑣,需要使用到com.fr.base.Style類及com.fr.base.FRFont,官方文檔中的方法是這樣的。// 建立樣式<br />Style style = Style.getInstance();<br />// 建立字型<br />FRFont frFont = FRFont.getInstance("Tahoma", Font.BOLD | Font.ITALIC, 20);<br />// 設定字型為紅色<br />frFont = frFont.applyForeground(Color.RED);<br />// 應用字型到樣式<br />style = style.deriveFRFont(frFont);<br />// 應用樣式到儲存格<br />cellElem.setStyle(style); 其中applyForground()方法和deriveFRFont()方法與一般習慣不同,它並對對象進行修改,而是返回一個應用了前景色彩(或字型)的新對象。所以需要重新給引用賦值 a = a.doXXX() 以保證更新。其實我們可以用一些便捷的方法。// 建立並應用樣式<br />Style style = Style.getInstance(FRFont.getInstance("Tahoma",<br /> Font.BOLD | Font.ITALIC, 20, Color.RED));<br />// 應用樣式到儲存格<br />cellElem.setStyle(style); 3. 設定行高和列寬。 因為行高和列寬會影響到整行或整列,所以它們是工作表的行為,而非儲存格。// 設定行高和列寬<br />worksheet.setRowHeight(0, 30);<br />worksheet.setColumnWidth(0, 200);
完整代碼: package fr.report;<br />import java.awt.Color;<br />import java.awt.Font;<br />import com.fr.base.FRFont;<br />import com.fr.base.Style;<br />import com.fr.report.CellElement;<br />import com.fr.report.DefaultCellElement;<br />import com.fr.report.ReportTemplate;<br />import com.fr.report.WorkSheet;<br />import com.fr.web.Reportlet;<br />import com.fr.web.ReportletException;<br />import com.fr.web.ReportletRequest;<br />/**<br /> * 程式網路報表 - Hello, World!<br /> * http://localhost:9527/FineReport/ReportServer?reportlet=fr.report.HelloReportlet<br /> *<br /> * @author GreatGhoul<br /> */<br />public class HelloReportlet implements Reportlet {<br /> @Override<br /> public ReportTemplate createReport(ReportletRequest arg0)<br /> throws ReportletException {<br /> // 建立報表<br /> WorkSheet worksheet = new WorkSheet();</p><p> // 在A1建立儲存格<br /> CellElement cellElem = new DefaultCellElement(0, 0, "Hello, World!");</p><p> // 建立並應用樣式<br /> Style style = Style.getInstance(FRFont.getInstance("Tahoma",<br /> Font.BOLD | Font.ITALIC, 20, Color.RED));<br /> // 應用樣式到儲存格<br /> cellElem.setStyle(style);</p><p> // 設定行高和列寬<br /> worksheet.setRowHeight(0, 30);<br /> worksheet.setColumnWidth(0, 200);</p><p> // 將儲存格加入到報表中<br /> worksheet.addCellElement(cellElem);</p><p> return worksheet;<br /> }<br />} 預覽程式網路報表 要預覽報表,只需要將編譯後的.class檔案放在報表伺服器classes檔案夾下,然後就可以通過如下形式的地址訪問報表了。 http://<報表伺服器地址>/ReportServer?reportlet=<實現了Reportlet的類的全限定名> 本例中,Reportlet的全限定名為fr.report.HelloReportlet http://localhost:9527/FineReport/ReportServer?reportlet=fr.report.HelloReportlet
效果如: