一种中式报表的生成方法与流程

文档序号:18900121发布日期:2019-10-18 21:49阅读:331来源:国知局
一种中式报表的生成方法与流程

本发明属于信息技术处理领域,特别是一种中式报表的生成方法。



背景技术:

在传统的电子报表生成方法中,总体上可以分为两种。一种以微软公司的excel为代表。这类报表一般不需要动态从数据库等数据源中组织数据,在利用工具设计结束后,得到的结果就是最终的报表。另一种则以水晶报表、中创inforreport为代表,这类报表需要动态的从数据库等数据源组织数据,在利用工具设计结束后,只能得到中间结果(领域术语称为报表模板),需用进一步处理后才能得到最终的报表。在第二种报表生成方法中,首先引用的是基于条带模型的报表工具。这类报表模型脱胎于西式报表,在处理一些数据复杂、格式复杂、计算复杂的中国特色报表(领域术语称为中式报表)时遇到较多的问题。后来国内技术人员对其进行了探索与改进,产生了基于网格模型的报表工具,这类工具结合了中式报表的一些特点,在多数据来源、基于网格的布局、报表列向扩展等方面都提出了很好的解决方案。但是,由于中式报表的复杂性,上述解决方案仍然存在较多问题。突出表现在:

中式报表从一个局部来看是规则的,可以归纳为某一报表模型来处理,但是在整体来看就是不规则的,不能将其划为任一种模型,即为局部规则、整体不规则。为处理这类问题,传统方法有二种:一是在报表区域中引入子报表,但是由于子报表和主表高度独立,导致报表丟失原先存在的数据关联性,并且导致原有的布局遭到破坏,增加了数据准备难度。第二种方法是打碎报表模型概念,将报表的属性转移到单元格上,通过单元格的设置完成局部区域的设计。这种方法虽然带来一些灵活性,但是仍然会破坏原有报表布局,并且使报表设计繁琐化,降低了报表抽象粒度,报表布局可能因扩展而破坏。

中式报表的数据运算相对简单,一般为普通数学运算;但是数据引用非常复杂,参加运算的数据具有很大的任意性,即数据运算复杂。而传统方法在处理这类运算时,一般只提供单一引用某单元格数据或统一引用数据集合数据两种形式。导致很多情况下数据运算只能由后台程序预先处理,大大加大了报表生成的工作量和难度。



技术实现要素:

针对传统中式报表生成存在的数据准备难度高、报表布局因扩展而破坏、数据引用复杂、报表运算复杂的缺陷,提出了一种中式报表的生成方法,解决了子报表扩展对报表整体布局的破坏问题,实现了子报表间的布局对齐和数据关联,提供了灵活的数据引用方法,解决了中式报表中数据运算依靠后台程序预先处理的问题,实现了灵活的数据运算。

一种中式报表的生成方法,包括以下步骤:

步骤一、根据获取的数据,建立报表数据集;

步骤二、根据报表局部规则性,建立多个子报表,将所述报表数据集中的相应数据集分别绑定到所述子报表中;

步骤三、设置所述子报表的数据关联、布局对齐属性;

步骤四、编写数据计算表达式到单元格,完成报表模板;

步骤五、运行所述报表模板得到实际报表。

优选的,所述步骤一中,所述数据的获取:从数据源直接获得和/或通过字段计算获得和/或自动生成获得。

优选的,所述步骤二中,所述数据集绑定到所述子报表:将数据集的字段设置到所述子报表所属的扩展区域中,扩展区域由子报表内的连续单元格组成,同时设置扩展区域的扩展属性,包括扩展方向和扩展次数。

优选的,所述步骤三中,所述子报表的数据关联的方式:包括内连接、左外连接、右外连接、全外连接。

优选的,所述内连接为只显示关联匹配数据;所述左外连接为完整显示左表数据、右表不匹配数据以空或指定符号代替;所述右外连接为完整显示右表数据、左表不匹配数据以空或指定符号代替;所述全外连接为完整显示左表、右表数据,不匹配数据以空或指定符号代替。

优选的,所述步骤三中,还包括,两个子报表的扩展区域内的匹配记录将相对各自扩展区域的起点产生相同的位置偏移。

优选的,所述步骤三中,子报表布局对齐的方式:高度对齐和宽度对齐,其中子表起始位置位于不同列上的子报表设置高度对齐属性,不同行上的子报表设置宽度对齐属性,同一子报表同时和不同的两个子报表分别设置高度对齐、宽度对齐属性。

优选的,所述步骤四,编写数据计算表达式到单元格还包括进行单元格数据引用、数据集引用。

优选的,所述单元格数据引用包括单元格的坐标描述,具体的采用绝对坐标引用或相对坐标引用;其中,绝对坐标引用单元格数据是指通过指定单元格在设计状态的坐标来引用报表扩展后某个单元格数据;相对坐标引用单元格数据是指通过指定单元的相对行列偏移值来引用扩展后某个单元格的数据。

优选的,所述数据集引用是提供过滤条件设置和偏移设置。

与现有技术相比,本发明的有益效果:

1.子表关联,降低数据准备难度。在传统报表工具中,遇到不同数据集需要进行关联计算的情况,需要在后台编写数据准备程序或存储过程,以将两个数据集合并。如果本来单个数据集的sql或存储过程已经非常复杂的情况下,这种合并将是非常耗时耗力的,并且以后很难维护。一旦两个数据集是不同的数据源,那么这种合并就要必须进行一方数据的转存,从而带来一系列的同步问题。应用该方法后,开发人员不用再进行数据准备工作,可以直接通过数据关联设置完成。比如a数据集通过sql语句获得,包含公司的财务数据,b数据集通过存储过程获得,包含公司的人事数据。应用数据集关联后,能够以公司为主键,轻松完成公司财务、人事数据的对比分析。

2.子表对齐,报表布局不因扩展而破坏。在传统报表工具中,为保证报表布局整齐美观,技术人员可能需要花费很大精力对报表进行调整。但是由于报表扩展数据的不确定性,导致经常出现扩展空白区域,虽然能够进行简单的处理,但是效果都不满意。应用子表布局对齐方法后,局部扩展的子报表能够和报表整体布局保持一致,并且能够选择空白区域的填充方式,避免了因为扩展而导致的布局破坏。

3.数据引用容易,报表运算实现简单。由于报表运算数据的任意性,以及引用数据能力的缺乏,导致很多业务逻辑很简单的计算方式在实际报表开发中很难实现,最终只能将这些结算任务抛到后台程序,降低了报表工具的价值,增加了技术人员的工作量。应用该方法后,引用数据能力增强,无论是单元格引用,还是数据集引用,都能将扩展形成的动态数据抓取过来,并进行自定义条件的过滤处理,报表运算变得简单。比如普通的分段统计、分组小计、同期比、上期比、逐一累计等都能通过数据引用实现。

附图说明:

图1为本发明的报表的生成方法的流程图;

图2为本发明实施例中子报表数据关联的示意图;

图3为本发明实施例中扩展导致真空区域的示意图;

图4为本发明实施例中子报表对齐的示意图。

具体实施方式

下面结合试验例及具体实施方式对本发明作进一步的详细描述。但不应将此理解为本发明上述主题的范围仅限于以下的实施例,凡基于本发明内容所实现的技术均属于本发明的范围。

图1为本发明实施例报表的生成方法的流程图。一种中式报表的生成方法,包括以下步骤:

步骤一、根据获取的数据,建立报表数据集;

图1为本发明实施例报表的生成方法的流程图。该流程开始于步骤一选择报表所属模型,建立报表数据集。本步骤中,报表模型是预先抽象好的,用户可以直接选择,并且在报表设计阶段也可以更改。数据集可以是多个,并且能够来自不同的数据源,包括数据库、java对象、文本文件(包括csv文件以及自定义分割符的其它文件)、xml文件(xml结构不受限制)。

数据集的字段除从数据源直接获得外,并且能够通过其他字段计算获得(称为计算字段),以及自动生成获得(称为追加字段,比如序号生成,以及字段拼接等)。

步骤二、根据报表局部规则性,建立多个子报表,将相应数据集分别绑定到子报表中;

在一个报表中根据局部规则性建立至少一个子报表,每个子报表属于某一报表模型。然后将步骤一建立的数据集绑定到子报表中。所谓绑定就是将数据集的字段设置到子报表所属的扩展区域中,扩展区域由子报表内的连续单元格组成,同时设置扩展区域的扩展属性。包括扩展方向、扩展次数。能够设置向下或向右扩展,以及最少扩展次数、最大扩展次数。

步骤三、设置子报表数据关联、子报表布局对齐属性;

根据子报表间数据的业务关联关系,设置两个子报表间的数据外键关联。这种关联分为内连接(只显示关联匹配数据)、左外连接(完整显示左表数据、右表不匹配数据以空或指定符号代替)、右外连接(完整显示右表数据、左表不匹配数据以空或指定符号代替)、全外连接(完整显示左表、右表数据,不匹配数据以空或指定符号代替)4种方式。子报表间通过连接字段建立关联。一个子报表可以与多个子报表建立外键关联,并且连接字段不必强制绑定到扩展区域。

子报表数据关联的匹配类似sql的内外连接。设置数据关联属性后,这两个子报表的扩展区域内的匹配记录将相对各自扩展区域的起点产生相同的位置偏移。如图2所示,来自2个结果集的数据通过关联字段建立关联后,能够在同一行上形成显示。

子报表数据关联后,可以设置基于整个连接结果集的字段排序、分组设置。各个子报表内的排序、分组设置不再生效。

为保证报表整体布局的完整性,可以设置子报表对齐属性。该属性能够保证子报表数据集在填充数据形成实际报表后,仍然能够保持相互间设置的对齐关系,避免出现因为扩展而导致的报表“真空”区域。比如起始位置位于同一行的两个子报表,一个扩展了6行,一个扩展了12行。如果没有子表对齐属性,将会在扩展了6行的子报表下方出现6行的扩展“真空”区域,这部分区域没有任何设置,将破坏报表的整体布局,其效果如图3所示。

子报表对齐包括:高度对齐、宽度对齐2种方式。子表起始位置位于不同列上的子报表能够设置高度对齐属性,不同行上的子报表能够设置宽度对齐属性。同一子报表能够同时和不同的两个子报表分别设置高度对齐、宽度对齐属性。

子报表设置高度对齐后,实际填充数据完成扩展后两个子报表的下边界位于同一行上,对于宽度对齐与此类似,实际填充数据完成扩展后,扩展后子报表的右边界位于同一列上。

子表对齐子报表能够设置扩展“真空”区域的填充方式,包括:扩展区域单元格填充、末行/列合并、起始格合并、等分行/列合并4种方式。扩展区域单元格填充就是以子报表扩展区域的单元格形式填充新扩充的扩展“真空”区域,直至与另一子报表对齐。末行/列合并则是将最后扩展的行/列演变为合并单元格进而向下/右进行合并处理。起始格合并就是将所有扩展“真空”区域合并为一个大的合并单元格。等分行/列合并是将新区域等分为几段,然后分别合并。如图4所示,在左边子报表向下扩展后,为保持整体报表布局完整性,右边子报表需要和左边子报表保持高度对齐,并且采用末行合并填充方式。

步骤四、编写数据计算表达式到单元格;

主要进行报表表达式的填写。报表中存在的运算方式、运算方法一般比较简单,普通的数学运算、逻辑运算以及统计方法即可满足大部分需求,但是参与运算的数据往往比较复杂,因此提供灵活的数据引用方式是解决报表数据运算难题的关键。该发明中,报表表达式除去算术、逻辑表达式、内建函数等传统运算方式、运算方法外,重点是增加了对单元格数据、数据集数据的引用。

具体来说,单元格数据引用的坐标描述有2种方法:绝对坐标引用、相对坐标。

绝对坐标引用单元格数据是指通过指定单元格在设计状态的坐标来引用报表扩展后某个单元格数据。虽然扩展后某个单元格的实际坐标可能已经变了,但是通过绝对坐标引用仍然能够访问到它。绝对坐标引用的形式为“$c{#〈列坐标〉,#<行坐标>}”。

相对坐标引用单元格数据是指通过指定单元的相对行列偏移值来引用扩展后某个单元格的数据。这样虽然一个单元格扩展为了一列/行单元格,但是通过相对坐标仍然能够对其进行分别引用。绝对坐标引用的形式为“$c{〈列偏移〉,〈行偏移>}”。

无论是绝对坐标还是相对坐标,都可以通过指定起始位置、结束位置以及跳跃步长来实现对一个连续或离散区域单元格的集合引用。比如可以将一个离散区域的单元格数据进行求和统计。区域引用的形式为“$c{〈起始单元格引用〉:〈结束单元格引用〉〈步长设置>;〈起始单元格引用〉:〈结束单元格引用〉〈步长设置〉;…}”。

数据集的引用主要是提供过滤条件设置和偏移设置。过滤条件可以为任意逻辑表达式,相当于sql语句的where子句,并且能够引用其它单元格和数据集的数据,偏移设置与单元格坐标描述类似,也分外绝对偏移和相对偏移。绝对偏移是指相对数据集第一条记录的偏移,相对偏移是指相对当前数据集记录的偏移。数据集引用的形式为“$f{<数据集名字〉.〈字段名字〉.〈偏移设置〉,〈过滤条件〉:t”。默认情况下偏移设置默认为空,过滤条件默认为空,代表该字段的所有记录。比如在分组报表中,对分组求和统计的表达式为“311111($?{<数据集名字>.<字段名字〉,〈分组字段=当前分组值单元格的引用>})”。在上期比计算中,对上期数据的引用表达式为“$f{〈数据集名字〉.〈字段名字〉.〈相对偏移坐标为-1〉,〈过滤条件>}”。

步骤五、运行报表模板得到实际报表。

子报表扩展时,扩展区域内每个数据集引用都形成一个扩展字段,所有扩展字段的过滤条件将被进行逻辑与操作,进而形成最后的结果集。然后按照子报表具体的扩展模型进行下一步的扩展处理。在一次扩展中,首先扩展区域被复制,然后依次填充静态单元格、扩展字段单元格。扩展字段单元格将依照当前数据集数据以及具体表达式进行重新计算。

设置了同一数据关联的多个子报表的扩展必须统一处理。当处理到设置了数据关联的子报表时,获得和该子报表建立关联的所有子报表,然后将各个子报表的数据集进行关联处理,获得统一的结果集,然后按照关联子报表的分组、排序设置进行调整,最后逐一将结果集分别填充到不同子报表的对应区域。完成后将对应子报表完成扩展的标志置为真,在往后的扩展中不再对其进行扩展处理。

设置了对齐属性的子报表将记录相关子报表的最下/右边界,在相关子表均完成扩展后,将按照最大的边界值进行高宽对齐调整。将扩展出的“真空”区域以指定的填充方式完成填充。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1