报表引擎API开发入门—简单程序数据集

小编最近接的项目是有关报表开发的,很想把这部分知识分享出来。希望大家能够支持我!不多说,马上进入我们今天的话题。

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.示例

下面我们定义数据集为如下样式:列为NameScore,值分别为Alex15Helly22Bobby99作为程序数据集。
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下面。此时该程序数据源便定义好了。
3.2
配置程序数据源
点击模板数据集下面的加号,选择程序数据集,然后在弹出的程序数据集对话框中,选择对应的class文件,如下图:

3.3
使用程序数据集
配置好程序数据源后便可以使用定义的程序数据集了,与其他类型的数据集使用方法是相同的,可以通过拖拽方法实现单元格数据列绑定。如下图:


今天就讲到这啦,是不是很不好懂,小编在做着项目之前没接触过报表开发也是费了一番功夫。大家继续关注哦!

这是一个通用报表引擎,构想完成的功能有: 1、提供给软件开发商一个报表开发中间件。针对c/s平台,用户可以以SDK的方式或Com的方式将其加入到自己的产品中。 针对b/s平台,该中间件通过在应用服务器端嵌入服务以处理WEB报表请求同时返回HTML页面。C/S架构中能够非常方便 的展示、打印、自动分页等功能,可以通过配置文件配置一张报表。支持复杂的财务报表。 2、可以作为一个通用的外挂式报表系统终端,可以在设计器中设计报表的取数规则,这些规则包括数据来源的数据库、数据 表以及相应的取数条件,这些规则会被报表底层解析成特定SQL语句并执行。最后将返回的数据直接按照配置的数据展示 逻辑展示在报表设计器中。 3、可以作为一般通用的表格应用系统被集成到应用软件中,以提供类似于Excel的部分基本表格功能。 以下为软件架构及开发现状的一点说明: 目前,报表底层大部分功能已经完成。Demo展示的报表设计器由于时间比较仓促部分底层已实现的基本功能还没能集成进去, 所以此Demo程序仅能展示部分功能。同时由于方便打包及展示,我特意将报表底层部件静态编译到了设计器中。这样演示的 时候作为一个“绿色软件”可以不基于其他支持库而运行。真正的报表底层包括以下几个Dll: 1、LTableLib.dll (提供表格的基本逻辑) 2、LGridLib.dll (提供数据表的一些增强功能) 3、LSheetLib.dll (提供类似于Excel中工作表的功能) 4、LGUILib.dll (提供表格绘制功能:为了兼容于非Windows系统(如Linux) ,特将系统相关的展现接口独立出来。可以非常方便的将本系统移植到非Windows系统中) 5、LGridBook.dll(封装类似于Excel中工作簿(Book)功能,本Dll为提供用户SDK开发的最终接口) 6、(可选)CLGridBook.dll(为了兼容其他支持Com标准的非c/c++开发工具(如:VB、VF、Delphi等),特意将底层封装 为一个标准Com组件,可以更加方便的提供支持) 最后,为了支持后续的功能扩展,系统设计成了一个开放性系统。新增的功能可以通过实现系统提供的各种插件接口进行任意扩展(如 Demo中插入图片的功能就是其中一个例子,另外艺术字及图表功能可以通过类似方式提供支持)。在可移植性方面,由于所有的底层代码 均采用标准C++编写,同时有效的将操作系统相关的技术进行了抽象(如展现GUI、事件、定时器、同步对象等)。在移植的时候只需要 重新实现几个简单的接口就可以了。 Demo中LRptDemo.etl文件是用设计器设计的一个报表样式,可以通过设计器将此文件打开展示。由于开发设计器的时间比较仓促,所以很多 菜单功能以及部分工具按钮功能还没有加进去(尽管这些功能以及被底层所支持)。 另:报表类似于Excel的公式及常用函数支持正在编写中,已实现的功能也不可避免的存在或多或少的BUG,见笑了 :) 如需要SDK/或COM开发包可以发邮件给我。呵呵:) E-Mail:zhiyong.luo@longshine.com
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leo.yuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值