DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: eyang11
今日帖子: 7
在线用户: 17
导航: 论坛 -> Web应用开发 斑竹:bodies  
作者:
男 fanruan (帆软传说哥) ▲▲▲▲△ -
普通会员
2015/8/24 16:16:39
标题:
FineReport报表引擎API开发入门—简单程序数据集 浏览:1410
加入我的收藏
楼主: 小编最近接的项目是有关报表开发的,很想把这部分知识分享出来。希望大家能够支持我!不多说,马上进入我们今天的话题。

API基本知识
小编最近项目所做的是关于一个报表软件—FineReport报表开发的一些事,也许有人接触过,知识相通,我今天就把我做的分享出来。
FineReport设计器与服务器不可能满足所有的需求,某些个性化需求可能无法实现。我们可以深入的开发与控制API接口。想要了解我们内核结构及api的使用,首先我们必须掌握一些基本的概念,下图就是我们内核的最基本图示。

图是网上找的,有点不清楚,大家放大看哈。

由于每个部分各自包含了很多属性,比如可以设置单元格的前景、背景、边框、字体、字号等;又比如每个WorkSheet中可以添加,删除单元格、可以设置每个sheet的页面属性、可以给每个sheet中添加图表悬浮元素等;再比如可以对WorkBook进行执行获得结果并导出成各种格式、可以进行打印、添加工具栏等等。下图为FineReport所有开放的API,我们今后都会用到。



简单程序数据集
FineReport设计器本身已经提供了数据库数据源、文本数据源、xml数据源等多种数据来源方式,同时程序员还可以通过java程序自行生成数据来源,只需要实现TableData接口便可以了。

1. 问题描述

FineReport报表的数据来源可以是数据库数据或是文本数据,并且还可以是其它任何类型的数据,因为FineReport是通过AbstractTableData抽象类来读取数据源的,而上述所有的数据来源都继承实现其抽象方法,因此只要实现了AbstractTableData抽象类,也就可以用自定义类型的数据源了(程序数据集),FineReport报表引擎就能够读取定义的数据源作为报表数据源使用。

2.实现原理
AbstractTableData抽象类主要有5个方法,如下:

1.获取AbstractTableData的总列数

publicintgetColumnCount();
2.获取AbstractTableData中第columnIndex列的列名

public String getColumnName(int columnIndex);
3.判断是否存在第rowIndex行,这主要是用于处理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取

publicbooleanhasRow(int rowIndex);
4.获取AbstractTableData的总行数

publicintgetRowCount();
5.获取AbstractTableData中第columnIndex列,第rowIndex行的数据

public Object getValueAt(int rowIndex, int columnIndex);
在某些应用场景中,需要在程序中对数据进行处理后再作为报表的数据源使用。

3.示例
下面我们定义数据集为如下样式:列为Name,Score,值分别为Alex,15;Helly,22;Bobby,99作为程序数据集。
3.1定义程序数据源
定义一个类,继承AbstractTableData,并实现里面的方法,具体的代码如下:

publicclassArrayTableDataDemoextendsAbstractTableData{
    // 定义程序数据集的列名与数据保存位置
    private String[] columnNames;
    private Object[][] rowData;
    // 实现构建函数,在构建函数中准备数据
    publicArrayTableDataDemo(){
        String[] columnNames = { "Name", "Score" };
        Object[][] datas = { { "Alex", new Integer(15) },
          { "Helly", new Integer(22) }, { "Bobby", new Integer(99) } };
        this.columnNames = columnNames;
        this.rowData = datas;
    }
    // 实现ArrayTableData的其他四个方法,因为AbstractTableData已经实现了hasRow方法
    publicintgetColumnCount(){
        return columnNames.length;
    }
    public String getColumnName(int columnIndex){
        return columnNames[columnIndex];
    }
    publicintgetRowCount(){
        return rowData.length;
    }
    public Object getValueAt(int rowIndex, int columnIndex){
        return rowData[rowIndex][columnIndex];
    }
}
将ArrayTableDataDemo.java编译生成ArrayTableDataDemo.class类。
将生成的类文件拷贝到报表工程/WEB-INF/classes目录下。由于该类是在com. fr.data包中的,因此最终应该将该ArrayTableData.class放在/WEB-INF/classes/com/fr/data下面。此时该程序数据源便定义好了。
此帖子包含附件:
PNG 图像
大小:114.6K
----------------------------------------------
-
作者:
男 fanruan (帆软传说哥) ▲▲▲▲△ -
普通会员
2015/8/24 16:17:41
1楼:
按此在新窗口浏览图片
此帖子包含附件:
PNG 图像
大小:114.6K
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2015/8/24 16:17:48
1楼: 楼主,你来错地方了吧。

做广告都不知道换一个正确的语言吗?
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS