读书人

FineReport运用 - 程序网络报表Hello,

发布时间: 2012-10-11 10:16:10 作者: rapoo

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即工作表,用于对报表进行布局和美化,由具有不同功能的单元格组成。

?

@Overridepublic 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

?

  效果如下图:

  FineReport运用 - 程序网络报表Hello,World | #报表

读书人网 >行业软件

热点推荐