一种自定义报表的生成管理方法及系统.pdf

上传人:a**** 文档编号:971837 上传时间:2018-03-22 格式:PDF 页数:27 大小:1.04MB
返回 下载 相关 举报
摘要
申请专利号:

CN200910305760.2

申请日:

2009.08.18

公开号:

CN101650712A

公开日:

2010.02.17

当前法律状态:

驳回

有效性:

无权

法律详情:

发明专利申请公布后的驳回IPC(主分类):G06F 17/24申请公布日:20100217|||实质审查的生效IPC(主分类):G06F 17/24申请日:20090818|||公开

IPC分类号:

G06F17/24; G06F17/30

主分类号:

G06F17/24

申请人:

深圳市科陆电子科技股份有限公司

发明人:

邓志峰

地址:

518057广东省深圳市南山区科技园南区T2栋五楼

优先权:

专利代理机构:

深圳市科吉华烽知识产权事务所

代理人:

胡吉科

PDF下载: PDF下载
内容摘要

本发明涉及一种自定义报表生成管理方法,用于浏览器/服务器结构,包括如下步骤:在浏览器上调用服务器上运用程序,显示服务器上所有报表清单的报表页面,选择其中一个报表;服务器生成所选报表,传送到所述浏览器。本发明还涉及一种自定义报表生成管理系统。实施本发明的自定义报表的生成管理方法及系统,具有以下有益效果:由于每个报表文件的模板中包括模板文件、样式文件和定义文件,因此,生成报表时报表的格式和报表的数据是分开生成后在组合的。故其扩展性较好、支持自定义查询条件。

权利要求书

1: 一种自定义报表生成管理方法,用于浏览器/服务器结构,其特征 在于,包括如下步骤: A)在浏览器上调用服务器上运用程序,显示服务器上所有报表清单的报表页面 ,选择其中一个报表; B)服务器生成所选报表,传送到所述浏览器。
2: 根据权利要求1所述的自定义报表生成管理方法,其特征在于,还 包括在所述服务器上建立报表文件,其包括: M)使用Excel生成多个存储在服务器内的报表文件。
3: 根据权利要求2所述的自定义报表生成管理方法,其特征在于,所 述步骤M)中进一步包括如下步骤: M1)使用Excel得到报表模板,生成模板文件; M2)将所述模板文件分区段,并定义所述模板文件中的每个区段,生成样式文件 ; M3)定义上述各区段中的数据,生成定义文件; M4)将上述文件传送到服务器的报表目录中指定位置,得到一个报表文件。
4: 根据权利要求3所述的自定义报表生成管理方法,其特征在于,所 述步骤M2)中所述定义区段包括:定义该区段中放置的数据项、所述数据项的位置以及所述 数据的显示格式。
5: 根据权利要求4所述的自定义报表生成管理方法,其特征在于,所 述步骤M3)中所述定义所述区段中的数据包括:数据的来源、数据查询方式、数据查询条件 、数据计算以及数据填充。
6: 根据权利要求5所述的自定义报表生成管理方法,其特征在于,所 述步骤M4)进一步包括如下步骤: M41)将所述模板文件、样式文件和定义文件传送到所述服务器指定目录中; M42)刷新报表页面,得到上述文件所生成的报表之清单。
7: 根据权利要求1所述的自定义报表生成管理方法,其特征在于,所 述步骤B)进一步包括: B1)产生该报表查询条件输入页面; B2)依据所述查询条件输入页面的内容,查询数据,生成报表; B3)输出生成的报表到所述浏览器。
8: 一种自定义报表生成管理系统,用于浏览器/服务器架构,其特征 在于,所述服务器上包括: 报表运行引擎:用于解析报表定义文件,查询报表需要的数据以及生成报表; 报表管理平台:用于发布、管理各类报表; 报表运行平台:用于显示在所述管理平台上发布的报表清单,当所述报表清单中 的一个被选中时,调用所述运行引擎,查找、生成报表,并输出。
9: 根据权利要求8所述的自定义报表生成管理系统,其特征在于,所 述报表运行引擎进一步包括用于在所述报表清单中一个报表被选拔中时产生查询条件输入页 面的查询条件输入页面产生单元。
10: 根据权利要求9所述的自定义报表生成管理系统,其特征在于, 所述报表管理平台包括:用于存放所述报表定义文件的报表定义文件存放目录、用于存放所 述报表模板文件和样式文件的报表模板文件和样式文件存放目录、用于存放于报表绑定数据 源的自定义数据源绑定报表存放目录、用于存放申明文件的自定义函数申明文件存放目录以 及用于存放所述查询页面的自定义查询条件页面存放目录。

说明书


一种自定义报表的生成管理方法及系统

    【技术领域】

    本发明涉及计算机领域,更具体地说,涉及一种自定义报表的生成管理方法及系统。

    背景技术

    目前国内各行业的各种应用系统对二次开发的要求越来越高。其中很多系统都明确指出了软件系统要有自定义报表系统,可由用户自行设计、定义报表。一些软件产品中也实现了自定义报表模块,但却不是完全意义上的自定义报表,只是提供了一些标准的报表样式,操作员可在提供的报表样式上选择一些系统提供的数据项,用来生成报表。这种报表有几个缺陷:扩展性差,如果需要的数据项报表模块未提供或如果所需的数据展示样式有所改变,而系统提供的已有样式不支持,就无法生成所需报表;也不能支持完全的自定义查询条件定义。另有一些软件产品,如iReport,Birt等,这些报表工具提供了自定义的报表设计器,可以在报表里使用SQL查询、Java Bean。但这些报表工具只是一个报表生成工具,运行时要靠外部程序来调用并提供参数或数据才能生成报表文件,本身并不是一个报表运行平台,不能进行报表发布,生成自定义查询条件。

    【发明内容】

    本发明要解决的技术问题在于,针对现有技术的上述扩展性差、不支持自定义查询条件的缺陷,提供一种扩展性好、支持自定义查询条件的一种自定义报表的生成管理方法及系统

    本发明解决其技术问题所采用的技术方案是:构造一种自定义报表生成管理方法,用于浏览器/服务器结构,包括如下步骤:

    A)在浏览器上调用服务器上运用程序,显示服务器上所有报表清单的报表页面,选择其中一个报表;

    B)服务器生成所选报表,传送到所述浏览器。

    在本发明所述的自定义报表生成管理方法中,还包括在所述服务器上建立报表文件,其包括:

    M)使用Excel生成多个存储在服务器内的报表文件。

    在本发明所述的自定义报表生成管理方法中,所述步骤M)中进一步包括如下步骤:

    M1)使用Excel得到报表模板,生成模板文件;

    M2)将所述模板文件分区段,并定义所述模板文件中的每个区段,生成样式文件;

    M3)定义上述各区段中的数据,生成定义文件;

    M4)将上述文件传送到服务器的报表目录中指定位置,得到一个报表文件。

    在本发明所述的自定义报表生成管理方法中,所述步骤M2)中所述定义区段包括:定义该区段中放置的数据项、所述数据项的位置以及所述数据的显示格式。

    在本发明所述的自定义报表生成管理方法中,所述步骤M3)中所述定义所述区段中的数据包括:数据的来源、数据查询方式、数据查询条件、数据计算以及数据填充。

    在本发明所述的自定义报表生成管理方法中,所述步骤M4)进一步包括如下步骤:

    M41)将所述模板文件、样式文件和定义文件传送到所述服务器指定目录中;

    M42)刷新报表页面,得到上述文件所生成的报表之清单。

    在本发明所述的自定义报表生成管理方法中,所述步骤B)进一步包括:

    B1)产生该报表查询条件输入页面;

    B2)依据所述查询条件输入页面的内容,查询数据,生成报表;

    B3)输出生成的报表到所述浏览器。

    本发明还揭示了一种自定义报表生成管理系统,用于浏览器/服务器架构,所述服务器上包括:

    报表运行引擎:用于解析报表定义文件,查询报表需要的数据以及生成报表;

    报表管理平台:用于发布、管理各类报表;

    报表运行平台:用于显示在所述管理平台上发布的报表清单,当所述报表清单中的一个被选中时,调用所述运行引擎,查找、生成报表,并输出。

    在本发明所述的系统中,所述报表运行引擎进一步包括用于在所述报表清单中一个报表被选拔中时产生查询条件输入页面的查询条件输入页面产生单元。

    在本发明所述的系统中,所述报表管理平台包括:用于存放所述报表定义文件的报表定义文件存放目录、用于存放所述报表模板文件和样式文件的报表模板文件和样式文件存放目录、用于存放于报表绑定数据源的自定义数据源绑定报表存放目录、用于存放申明文件的自定义函数申明文件存放目录以及用于存放所述查询页面的自定义查询条件页面存放目录。

    实施本发明的自定义报表的生成管理方法及系统,具有以下有益效果:由于每个报表文件的模板中包括模板文件、样式文件和定义文件,因此,生成报表时报表的格式和报表的数据是分开生成后在组合的。故其扩展性较好、支持自定义查询条件。

    【附图说明】

    图1是本发明自定义报表的生成管理方法及系统实施例中报表的生成流程图;

    图2是所述实施例中报表清单生成流程图;

    图3是所述实施例中系统结构示意图;

    图4是所述实施例中报表管理平台中目录结构示意图。

    【具体实施方式】

    下面将结合附图对本发明实施例作进一步说明。

    如图1所示,在本发明自定义报表的生成管理方法及系统实施例中,其报表生成方法包括如下步骤:

    步骤S11显示报表清单,并选中其中一个:在本步骤中,在浏览器上调用服务器上运用程序,显示服务器上所有报表清单的报表页面,并选中其中一个报表。

    步骤S12产生报表查询输入页面:服务器收到浏览器提交的被选中报表后,在上述浏览器上产生一个报表查询输入页面,该查询输入页面地作用是用来进一步定义该报表的数据来源、数据格式等与报表中数据相关的事项。

    步骤S13依据所述查询输入页面内容,查询数据,生成报表:由于报表的模式和报表中的数据都已被定义,所以,在本步骤中,就是将上述各部分组织起来,生成报表。

    步骤S14输出所生成的报表:在本步骤中,将上述生成的报表传送到所述浏览器上显示出来。

    上面的步骤可以描述如下:点击一个报表,按照配置的输入参数生成输入查询条件的页面,输入指定的查询条件并提交,报表引擎查询数据,生成报表文件并以Html格式输出到浏览器显示出来。也可输出为Excel文件。根据定义中的输入参数生成输入查询条件的页面;输入查询条件,提交查询;从提交的表单中获得查询参数的输入值;将查询条件送给各个数据源执行查询;将查询返回的结果放在数据对象集合中;对数据对象集合中的数据进行再计算、统计等处理;生成ExcelReport对象,将数据对象集合中的数据输出到ExcelReport对象,生成报表文件。

    在图1中,我们直接调用了报表清单,但是,该报表清单同样是需要在事先构建的。图2示出了报表清单的构造流程,在图2中,包括如下步骤:

    步骤S21使用Excel得到报表模板,生成模板文件:在本步骤中,按照需求,用Excel画报表模板。生成一个Excel格式的模板文件(xls文件)。

    步骤S22生成上述报表模板的样式文件:将模板按以上方式分好各个区段,定好每个区段中要放置的数据项。以及数据项的位置,显示格式等。将这些配置信息记录在样式文件中。生成一个样式文件(xml文件)。

    步骤S23生成上述报表模板的定义文件:设计报表的数据来源,如何查询,查询条件。原始查询数据是否需要再计算处理。数据填充(与样式文件中定义的数据项相匹配)。将这些配置信息记录在报表定义文件中。生成一个定义文件(xml文件)。

    步骤S24存储上述文件到指定目录,得到报表文件:在本步骤中,将上述三个文件上传到服务器指定目录中,即可得到报表文件。

    步骤S25刷新报表页面,得到报表清单:在报表页面里刷新列表,就可以看到新提交的报表。

    事先多次重复上述步骤S21到S25,即可配置多个报表模板,当然,如果临时需要增加一个报表模板,也可以单独执行上述步骤S21到S25。

    在本实施例中,样式文件中定义了报表的输入参数,数据源,数据计算方法,数据输出等;而定义文件是一个标准格式的XML文件,其格式符合XML文件格式的要求。以UTF-8作为编码格式。

    本实施例中还揭示了一种自定义报表生成管理系统,该系统用于浏览器/服务器架构,所述服务器上包括:用于解析报表定义文件,查询报表需要的数据以及生成报表的报表运行引擎1、用于发布、管理各类报表的报表管理平台3和用于显示在所述管理平台上发布的报表清单、当所述报表清单中的一个被选中时,调用所述报表运行引擎1去查找、生成、输出报表的报表运行平台2。上述报表运行引擎1、报表运行平台2和报表管理平台3之间的结构如图3所示。其中,所述报表运行引擎1进一步包括用于在所述报表清单中一个报表被选拔中时产生查询条件输入页面的查询条件输入页面产生单元。

    如上所述,报表管理平台3用于发布管理各类报表,其实质上是对这些报表的目录进行管理,如图4所示,报表管理平台3中得目录包括:用于存放所述报表定义文件的报表定义文件存放目录31、用于存放所述报表模板文件和样式文件的报表模板文件和样式文件存放目录32、用于存放于报表绑定数据源的自定义数据源绑定报表存放目录33、用于存放申明文件的自定义函数申明文件存放目录34以及用于存放所述查询页面的自定义查询条件页面存放目录35。

    如前所述,在本实施例中,系统启动,加载自定义函数声明文件,加载字典表定义、数据源定义等;当一个自定义报表名称被选中时,系统启动自定义报表引擎(Engine)处理,其过程如下:首先根据报表定义文件构造一个报表定义对象(ReportDefine对象),然后根据该定义对象构造一个自定义报表处理引擎(Engine)类实例;从ReportDefine.inputParameters中可得知为该报表定义的自定义查询条件,为每一个查询条件生成对应的查询条件输入控件。最后生成输入各个查询条件的页面。输入完查询条件后提交时,系统按照查询条件中定义的检验方法对输入值进行校验,校验成功才可以提交查询。提交查询之后,系统处理提交的查询条件,将所有的参数输入值放入Engine.inputData中;并逐个处理ReportDefine中的数据源定义:对于SQL数据源,处理SQL中的嵌入式表达式,得到目标SQL语句,执行查询,得到查询结果,将查询结果DataSet放入Engine.data中;对于Java数据源,通过调用自定义函数,执行一个Java方法。将该方法返回的数据对象放入Engine.data中;对于DSF数据源,首先构造一个DSF对象,然后在该对象上执行查询,将返回的DataSet对象放入Engine.data中。在处理完上述数据源定义后根据ReportDefine中.calData部分的定义,Engine.data中存放的数据对象进行再计算,比方说产生一些统计数据等。可修改已有对象中的数据,也可产生新数据。新输入一般存入一个新的map中。当上述数据再计算完成后,根据报表样式文件构造一个ExcelEngine对象,然后按照ReportDefine.segmentDatafile中对各区段的数据项定义输出数据到ExcelEngine对象;如果绑定整个区段到一个数据对象上的,将数据对象从Engine.data中取出来,直接提交给ExcelEngine对象,生成报表的相应部分;如果区段数据项为逐个配置的,首先构造一个新的map,调用自定义函数和嵌入式表达式处理引擎,对数据项配置公式进行计算,将数据项名称和计算结果放入map,该区段的全部数据项都处理完后,将整个map提交给ExcelEngine对象,生成报表的相应部分。至此,报表生成完毕。

    如果需要按Html样式将报表内容显示在客户浏览器上,那么调用ExcelEngine的export方法,得到Html格式的报表内容,然后将Html内容写入到response,最终显示在客户浏览器上。一般来说,报表内容应显示在独立的frame里;如果需要生成Excel文件供客户下载到本机,那么调用ExcelEngine的export方法,得到byte[]格式的Excel文件内容,然后将数据直接写入response,客户浏览器就会提示下载或打开Excel文件;如果需要在服务器端生成Excel文件,可调用ExcelEngine.write方法,将报表内容写入到Excel格式的文件中。至此,报表输出到客户端。

    上面说过,定义文件是一个标准格式的XML文件,其格式符合XML文件格式的要求。以UTF-8作为编码格式。本实施例中的定义文件如下:

    普通明细表_SQL数据源_操作员清单.xml

    <?xml version=″1.0″encoding=″UTF-8″?>

    <reportdefine>

     <report-define

      name=″操作员清单″

      type  =″grid″

      stylefilename=″DataSet普通明细表操作员清单_style.xml″/>

        <input-parameters>

      <item

       no   =″1″

       name  =″s_gdj″

      displaytext =″所属供电局″

      datatype =″c″

      allowignore =″false″

      min  =″″

      max  =″″/>

    </input-parameters>

    <datasource>

     <sql

      name  =″czy″

      sql   =’select a.*,b.s_itemvalue as s_gdj_text,c.s_mc as s_js_text

      from czy a,pub_dictitem b,js c

      where a.s_gdj = b.s_itemid and b.n_typeid = 7

      and a.s_jsbh = c.s_jsbh

      [%=getInput(e,″s_gdj″).length()>0?″and a.s_gdj = &apos;″+getInput(e,″s_gdj″)+″&apos;″:″″%]

      order by a.s_czybh’

      />

    </datasource>

    <caldata>

    </caldata>

    <segment-data>

     <title

      bind  =″false″>

      <item name =″title″formula =’getInput(e,″s gdj.text″)’/>

      <item name =″printdate″formula =’today()’/>

     </title>

     <body

      bind  =″true″

      type  =″dataset″

      source  =″czy″/>

    </segment-data>

    <remark>xml文本中,小于-&lt;大于-&gt;双引号-&quot;单引号&apos;</remark>

    </reportdefine>

    该文件就是一个标准格式的XML文件,格式符合XML文件格式的要求。以UTF-8作为编码格式。

    注意:在定义节点属性时,属性内容必须符合XML文件的格式要求。其中的几个特殊字符应使用转义符。

    小于(<)-&lt;大于(>)-&gt;双引号(“)-&quot;单引号(‘)-&apos;

    <和>符号必须使用转义符。

    如果属性定义是以双引号开头的,那么属性内容里可使用单引号,但双引号必须使用转义符。

    如果属性定义是以单引号开头的,那么属性内容里可使用双引号,但单引号必须使用转义符。

    在本实施例的定义文件中,根节点的名称为<reportdefine>,<reportdefine>的第一个子结点是<report-define>,该节点是对整个报表的定义,有以下属性:

    <report-define

     name    =″操作员清单″

     type    =″grid″

     stylefilename =″DataSet普通明细表_操作员清单_style.xml″/>

    在上面描述的属性中,name:报表名称,String,运行时如果输出Excel文件,则Excel文件名就是这个名字。

    type:报表类别,Sting,可选值:card/grid/group

    card-卡片报表,单记录,一个表体

    grid-明细报表,一个表头、表尾,多个明细区

    group-分组报表,一个表头、表尾,多个分组。每个分组里可以有一个分组头、分组尾,多个明细区。

    stylefilename:该报表所使用的样式文件名,String,注意只有文件名,没有路径,路径定义在全局参数里。

    在本实施例的定义文件中,输入参数定义在<input-parameters>段里。这些参数可以是简单输入参数、映射到数据源字段上的输入参数、复杂输入参数以及自定义查询条件页面。如果报表不需要输入参数,<input-parameters>段可以没有子结点。

    当这些参数是简单输入参数时,其代码如下:

    <input-parameters>

     <item

      no    =″1″

      name   =″s_gdj″

      displaytext =″供电局编号″

      show   =“true”

      datatype  =″c″

      allowignore =″false″

      min  =″″

      max  =″″   initvalue =“0001”/>

    </input-parameters>

    每一个输入参数是一个Item项。其中:

    no:该输入参数的序号,int,>=1,不能省略

    name:该输入参数的名称,String,不能省略

    displaytext:该输入参数的标签。String,该标签运行时显示在输入控件的左边。如果设置了mapping属性,可使用字段的中文名做标签,可省略。

    show:是否显示该输入参数。Boolean。默认为true。如果设置为false,则程序运行时只输出一个名为name的<hidden>对象,但不显示该输入参数。可在程序中设置值。show=false时,其他mapping属性,render属性都不再起作用。

    datatype  :该输入参数的数据类型,String,可选值为:c/n/d,即字符型/数字型/日期时间型。默认为字符型。参数为简单输入参数时,不可省略。

    allowignore:该输入参数是否可忽略,Boolean,”true”/”false”,默认为”true”。如果该参数定义为false,则运行时必须输入该参数查询才可提交。

    min:允许输入的最小值,String。数据类型为数字型或日期型时起作用。如果不为空,则输入完该参数提交查询时会进行最小值检查。如果不需要检查,则为空。

    max:允许输入的最大值,String。数据类型为数字型或日期型时起作用。如果不为空,则输入完该参数提交查询时会进行最大值检查。如果不需要检查,则为空。

    initvalue:初始值。String,可为空。运行时该值会显示在输入控件中作为默认值。Initvalue可使用嵌入式表达式。如:initvalue =’[%=getSessionAttr(″GDJBH_String″)%]’运行时将会以当前登录操作员所在的供电局编号作为初始值。关于嵌入式表达式,将在后续章节介绍。

    以上定义了一个最基本的输入参数。运行时查询页面会显示一个文本框用来手动输入供电局编号。并且不能为空。

    如果需要使用其他方式输入参数,如使用下拉框来显示可选供电局,或者使用dtpicker来显示一个日期,那么可使用映射到数据源上的某个字段的配置信息来生成输入参数(关于数据源的含义请参阅相关文档),其代码如下:

    <item

     no    =″1″

     name   =″s_gdj″

     displaytext =″所属供电局″

     mapping  =″unireport inputparameter.s gdj″

     allowignore =″false″

    initvalue  =“0001”/>

    其中,mapping:映射到某个数据源对象的某个字段上。String。格式为:数据源对象名称.字段名称。比如说,系统数据源unireport_inputparameter中定义了一个名为s_gdj的字段,那么运行时就会生成一个不可编辑的下拉框,然后以字典表“供电局”中的项目来填充该下拉框。

    映射到数据源字段上的输入参数可表现为:文本框,可编辑的下拉框,不可编辑的下拉框,checkbox,DTPicker,按钮等各种样式。并且可以设置最大值最小值等条件。

    对某些特别复杂的输入参数,如输入供电局时,希望输入控件为一个<hidden>记录供电局编号,然后再显示一个不可编辑的文本框显示供电局名称,然后旁边再显示一个选择按钮。按下选择按钮弹出一个选择供电局的窗口,选择了一个供电局之后,将选择供电局的编号记录在<hidden>中,将选择供电局的名称显示在文本框中。这种复杂的情况,可使用render方法渲染出一个特殊的输入控件。其代码如下:

    <item

     no   =″1″

     name  =″s_gdj″

     show  =″true″

     displaytext  =″供电局″

     render  =″Render_Gdj(’s_gdj’)″

     initvalue =’0001|园区供电局’

    />

    其中,render  :定义渲染方法。String。这里渲染方法是指程序运行时在标签右边先生成一个名为div_s_gdj的层,内容为空,然后在页面的body_onload事件里再调用JS脚本中相应的渲染对象生成div_s_gdj的内容。如上生成文本框和按钮,并响应按钮按下事件

    如上,事先在一个名为userfunction.js文件中定义了Render_Gdj这渲染对象。代码如下:

    var Render_Gdj = Class.create();

    Render_Gdj.prototype={

     id:″″.

     text:″″,

     initialize:function(id){

      this.id=id;

      this.text=id+″.text″;

     },

     toString:function(){

      return″<input type=’hidden’id=’″+this.id+″’name=’″+this.id+″’>″+

         ″<input type=’text’id=’″+this.text+″’name=’″+this.text+″’class=’input_80width’readonly>″+

         ″<input type=’button’value=’?’title=’选择供电局’class=’button’style=’width:15’onclick=’javascript:render_″+this.id+″.onclick();’>″;

     },

     onclick:function(){

      var ret = pub_select_record(

       ″请选择一个供电局″,

       ″供电局编号|10|c~供电局名称|20|c″,

       ″select s_itemid.s_itemvalue from pub_dictitem where n_typeid = 7orderby s_itemid″);

      if(ret == null)return;

      $(this.id).value = ret[0];

      $(this.text).value = ret[1];

     },

     render:function(div){

      if(div == null || div == undefined){

       $(″div_″+this.id).innerHTML = this.toString();

      }else{

       $(div).innerHTML = this.toString();

      }

     },

     setValue:function(value){

      if(value == null || value == ″″)return;

      var ss=value.split(″|″);

      $(this.id).value = ss[0];

      if(ss.length > 1){

       $(this.text).value = ss[1];

      }

     }

    };

    运行时,查询条件页面会生成一个名为render_s_gdj的JS对象,然后调用render_s_gdj.render()方法生成div_s_gdj的内容。通过使用渲染对象,可生成任何复杂的查询条件输入框。

    对于特别复杂的查询条件。如果无法使用以上方法生成,那操作员也可自定义查询条件的页面,保存为html文件或jsp文件。然后将文件上传到指定目录中,并在<input-parameters>节点里添加属性searchpage指明该报表使用一个自定义的查询页面。如

    <input-parameters searchpage=”/unireport_searchpage/operator_list.jsp”>

    指定了自定义的查询页面后,无需再配置各个输入参数。自定义配置文件一般存放在一个虚拟目录中。

    此外,每个报表都要定义数据源。一个报表中可以有一个或多个数据源。系统运行时,根据数据参数,进行查询,获取数据。获取的数据存储在数据对象集合中。在本实施例中,数据源定义在<datasource>段里。如以下数据源定义:

    <datasource>

     <sql

      name   =″dlsd″

      sql    =″select n_zxygz,datepart(Hour,d_cjsj)as n_hour from dlsdwhere s_bbh =’[%=getInput(”s_bbh”)%]’and d_cjsj>=’[%=getInput(”d_rq”)%]’and d_cjsj<’[%=getInput(”d_rq1”)%]’order by d_cjsj″/>

     <sql

      name   =″ssl″

      sql    =″select n_ua,n_ub,n_uc,datepart(Hour,d_cjsj)as n_hour fromssl where s_bbh =’[%=getInput(”s_bbh”)%]’and d_cjsj>=’[%=getInput(”d_rq”)%]’and d_cjsj<’[%=getInput(”d_rq1”)%]’order by d_cjsj″/>

    </datasource>

    每个数据源定义在一个子结点中。每个数据源都有一个name属性,定义该数据源的名称。之后程序访问数据源对象里的数据也是按照名称来访问。不同数据源应配置不同的名称。系统支持三种数据源:SQL数据源:通过定义一个查询数据的SQL语句,到数据库中执行查询,将查询结果作为数据源内容。SQL语句中支持嵌入式表达式。Java数据源:通过访问一个Java方法,获得所需的数据。该Java方法可以是本地类的方法,也可以是一个远程EJB方法调用。DSF数据源:通过访问DSF(DataSourceDefine)对象,获取所需数据。查询数据源,返回字段都已定义在DSF对象中,查询时只需提交查询条件即可。可认为是SQL数据源的高级版,即将基础表数据中编码字段进行转换后返回。并且可对字段值进行格式化处理。在一个报表中可以同时配置多个多种数据源。

    当数据源执行完查询后返回的数据对象有以下几种:

    BEAN-单个的Java Bean,实际就是一个Java类实例。通过访问指定的方法获得数据。

    MAP-Java Map对象。通过Key可从Map中获得数据。

    ARRAY- Java Array对象,即数组。里面的数据只能按顺序(索引)访问。

    LIST-Java List对象。同Array类似,里面的数据只能按顺序(索引)访问。

    DATASET_ROW-Java DataSet对象。即数据集对象对象,但只使用DataSet中的当前记录。

    LIST_BEAN-Java List<Bean>对象,Bean对象的集合。

    MAP_BEAN-Java Map对象,Map<BeanName,BeanObject>。一次调用返回多个Bean。返回后,将以数据源名字.BeanName为名字将BeanObject放入返回数据对象集合中。一般不需要定义返回值类型为MAP_BEAN的Java数据源方法。可定义多个数据源,每个数据源的Java调用方法返回单个Bean。

    LIST_MAP-Java List<Map>对象。List中的每个元素是一个Map。

    DATASET-数据集对象。(自定义),类似于ResaultSet。其中可包含多条记录。

    GROUP_MAP-Java Map<Bean1,List<Bean2>>对象。一般用来给分组报表提供数据。Bean1用来提供分组的数据,List<Bean>用来给该分组的明细区提供数据。

    上述BEAN、MAP、ARRAY、LIST、DATASET_ROW对象可当作是单条记录,只包含一个实体的多个属性数据。可用来填充报表中的各个区段。

    上述LIST_BEAN、LIST_MAP、DATASET包含多条记录,可以用来填充明细区。

    上述GROUP_MAP既包含分组数据,也包含分组明细数据,用来给分组报表提供数据。

    上述MAP_BEAN包含多个互不相干的Bean。

    SQL数据源和DSF数据源只返回DATASET数据对象,Java数据源可返回任何一种数据对象

    以sql作为子结点名称定义的数据源是SQL数据源,其代码如下:

    <sql

     name   =″dlsd″

     sql  =″select n_zxygz,datepart(Hour,d_cjsj)as n_hour from dlsd wheres_bbh =’[%=getInput(”s_bbh”)%]’and d_cjsj>=’[%=getInput(”d_rq”)%]’andd_cjsj<’[%=getInput(”d_rq1”)%]’order by d_cjsj″/>

    其中:

    Name:该数据源的名称。String。

    Sql:查询数据的SQL,String,支持嵌入式表达式。以上的例子中为了浏览清楚,将SQL中的转义符改回原始值,实际配置时应注意。

    SQL数据源返回的结果是一个记录集(DataSet)对象。

    以java作为子结点名称定义的数据源是java数据源,Java数据源是指在运行时刻访问一个java方法得到的数据源。其代码如下:

    <java

     name  =″czy″

     method  =’getCZYList(getInput(″s_gdj″))’

     return  =″list_bean″/>

    其中:

    Name:数据源名称,String

    Method:方法名称,String。支持自定义函数。

    Return:返回数据类型,String,可选值包括bean,map,array,list,dataset_row,list_bean,map_bean,list_map,dataset,group_map;

    在上述内容中,method方法可以使用自定义函数。自定义函数的声明文件应在web服务器启动时加载。

    如以上的方法getCZYList(getInput(″s_gdj″))中,使用了一个自定义函数getCZYList(getInput(e,″s_gdj″)),该函数的声明如下:

    public static ArrayList getCZYList(String gdj)throws UniException{

    }

    声明了该方法以后,就可以在自定义函数中使用了。

    方法执行完毕后返回的数据先存放在返回数据集合中。

    以dsf作为子结点名称定义的数据源是DSF数据源,其代码如下:

    <dsf

     name  =″czy″

     alias  =“xt_czy”

     preset_where =“s_isadmin=‘0’”

     preset_orderby =“s_czybh”/>

    其中:

    Name:该数据源的名称。String。

    Alias:数据源的别名,String。

    Preset_where:预置的查询条件。String。可省略。

    Preset_orderby:预置的排序条件,String。可省略。

    DSF数据源可看做是SQL数据源的升级,它也是返回一个DataSet对象。但DSF数据源是通过在在DSF对象上进行查询,返回事先定义好的字段。并且按照DSF中定义的转码方式对原始数据进行Value-Text的转换及一些数据格式化的处理。查询时会将Presetwhere和运行时输入的查询条件结合在一起进行查询(两个查询条件之间是And关系)。如上例,查询结果中只会得到不是管理员的操作员。并且默认的排序条件是按操作员编号进行排序。

    在本实施例的定义文件中,数据再计算过程定义在<caldata>段里。可为空。例如:

    <caldata>

     mymap = new HashMap();

     mymap.put(″usercount″,getDataSet(″czy″).count(″*″));

     mymap.put(″avg_age″,getDataSet(″czy″).avg(″age″));

     pubData(e,″totaldata″,mymap);

    </caldata>

    系统对各个数据源进行处理完后,将返回的数据对象放在数据对象集合中。对数据对象集合中的数据可以进行再计算。再计算一般包含对数据虚拟列的计算(如DataSet);对数据进行统计(如计数、求和、求最大值最小值平均值等),产生的统计结果数据可存储到新的数据对象(如新产生一个Map)。

    再计算过程都是通过自定义函数来实现的。通过在<caldata>节点之间配置自定义函数来实现。自定义函数可以是多条,每条语句末尾为分号(;),语法要符合Java语言的语法规则。多条语句之间顺序执行。

    在上述例子中,首先生成一个HashMap对象mymap,然后给该map中添加了两个数据项:usercount?数据集czy的记录数求和,avg_age?数据集czy对全部人员年龄求平均值。最后将这个map添加到数据对象集合中。在输出程序也可以使用该数据对象。

    数据再计算完毕后,就进行数据输出步骤,在本实施例的定义文件中,数据输出定义在<segment-data>段里。如下:

    <segment-data>

     <title

      bind  =″false″>

      <item name =″title″formula =’getInput(″s_gdj.text″)’/>

      <item name =″printdate″formula =’today()’/>

    </title>

     <body

      bind  =″true″

      type  =″list_bean″

      source  =″czy″/>

    </segment-data>

    在本实施例中,数据输出指的是将数据按区段提交给ExcelEngine对象,由ExcelEngine对象生成报表区段,并填充数据,最后生成报表。

    在<segment-data>段里定义了报表的每个区段中的每个数据项绑定到数据对象集合中的哪个数据对象上。可将一个区段绑定在一个数据对象上,也可以配置一个区段中的各个数据项绑定在不同的数据对象的不同字段(或属性)上。<segment-data>段的各个子结点名称应以报表区段名称为节点名称。

    其中:

    Bind:该区段是否绑定在一个数据对象上。Boolean,不可省略。如果bind =“false”,表示该区段中的数据项需要逐个配置。每个数据项的配置在<item>子结点中。

    Item子结点:

      Name:数据项名称,String。

      Formula:数据输出公式,String。使用自定义函数。

    其中,Item的Name需要与报表样式文件中定义的数据项名称相匹配。如以上报表,样式文件中表头段的数据项定义为:

    <report-title-define>

     <item name=″title″row=″2″col=″b″display=″true″format=″%1$s操作员清单″format_data_type=″c″length=″0″datatype=″c″/>

     <item name=″printdate″row=″3″col=″e″display=″true″format=″″length=″0″datatype=″d″/>

    </report-title-define>

    其中定义了两个数据项:title和printdate。

    如果bind =“true”,就不需要再逐个配置数据项了。

    Type:数据对象类别,String,可选值:bean,map,array,list,dataset_row,list_bean,list_map,dataset

    Source:数据对象名称,String,可使用数据对象集合中的任何对象。

    进行了绑定配置后,系统将会直接把数据对象交给ExcelEngine对象去填充区段中的单元格。但要保证数据对象中的各数据名称和报表样式文件中定义的数据项名称相匹配(按名称访问数据项时)或顺序相匹配(按顺序访问数据项时)。

    在本实施例中,如果报表被定义为一个分组报表(<report-define type=”group”>),那么还需要定义分组数据输出段。如果报表是其他类型,则不需要该段代码:

    <group-data

     datasource   =″dataset″

     dsgroup   =″yh″

     dsbody   =″gdjl″

     filterfield  =″s_bbh″/>

    其中:

    datasource:数据源类别,String,可选值:dataset/map。表示使用哪种数据源。datasource =“dataset”时,需定义以下属性:

    dsgroup:分组部分数据集(DataSet)对象名称,String

    dsbody:分组明细部分数据集对象名称,String

    filterfield:过滤字段名称,String

    datasource =“map”是,需定义以下属性:

    Map:分组数据对象(Map)名称,String。

    可使用两种方式为分组报表提供数据。其一使用两个数据集对象。dsgroup和dsbody。运行时按顺序读取dsgroup中的数据作为分组数据项,然后按filterfield字段到dsbody过滤,得到当前分组记录对应的明细数据项,再生成该分组的明细数据。其二是使用一个Map对象,<groupBean,List<Bean>>,groupBean提供分组部分数据,List<Bean>部分提供该分组的明细数据。

    注意:报表定义为分组报表时,报表的表头表尾部分还需要按区段定义,分组部分定义在<group-data>中。

    此外,在本实施例中,系统也可使用自定义函数。自定义函数可以单独使用,也可以放在嵌入表达式中。比如:initvalue=’[%=getSessionAttr(″GDJBH_String″)%]|[%=getSessionAttr(″GDJMC_String″)%]’中,getSessionAttr(″GDJBH_String″)就是个自定义函数放在嵌入式表达式中的例子。又如:sql  =″select n_zxygz,datepart(Hour,d_cjsj)as n_hour from dlsd where s_bbh=’[%=getInput(”s_bbh”)%]’and d_cjsj>=’[%=getInput(”d_rq”)%]’and d_cjsj<’[%=getInput(”d_rq1”)%]’order by d_cjsj″也是嵌入式表达式的例子。

    嵌入式表达式是指该内容本身是一段文本,其中嵌入有[%.......%]这样的标签,标签里是嵌入式表达式,运行时系统可解释执行嵌入表达式,用计算结果替换标签。将最终结果文本提供给程序使用。标签[%%]中的内容应是一个有效的Java语句,可包含自定义函数,系统函数,各种运算符。但最终计算结果应返回一个字符串。标签里的语句应以=(等号)开始。并且内部表示一个字符串变量时,应以双引号(”)作为字符串两端的边界。又如:<item name =″title″formula =’getInput(″s_gdj.text″)’/>,就是一个直接使用的例子的自定义函数

    自定义报表中访问所在应用系统函数、变量,都是通过自定义函数进行的。系统运行时,通过引擎调用自定义函数,进行数据计算,返回计算结果输出到报表中。因此系统所有和数据访问计算相关的功能都是通过自定义函数实现的。自定义函数也是系统的一大特色。系统安装时,已提供了一部分自定义函数。在实际运行中,如果已提供的还不够,可自己再开发相应的Java程序,开发完后打包成Jar文件,发布在应用服务器的相应lib目录中,然后将函数的声明添加到自定义函数声明文件中,就可以使用新加的自定义函数了。

    自定义函数实际上使用了BSH包来计算自定义函数或表达式。

    在本实施所述的自定义报表产生管理系统中,管理平台实际上就是管理报表定义文件的目录结构,文件上传下载与删除。其中,其数据文件目录结构如下:

    Unireport :数据文件根目录

    -define:报表定义文件存放目录。存放报表定义文件(xml格式)该目录下可任意创建子目录名,目录名就作为报表的分类名,目录级数没有限制。报表定义文件扩展名为.xml。

    -dsf:自定义数据源绑定报表存放目录。目录下是全部数据源绑定报表的定义。该目录下可任意创建子目录名,目录名就作为报表的分类名,目录级数没有限制。每个报表定义一个空文件。文件名为″报表显示名称~对应数据源别名.txt″,扩展名任意,无扩展名也可。

    -model:报表模板文件和样式文件存放目录。模板文件(xls格式),样式文件(xml格式)

    -userfunction:自定义函数声明文件存放目录。声明文件是文本文件(txt格式)

    -unireport_searchpage:自定义查询条件页面存放目录。运行时将该目录映射为web服务器下的一个虚拟目录。如果web服务器不支持映射虚拟目录,也可将该目录直接放在webapps下。

    在本实施例中,结构与文件目录结构及报表文件名相同,这样简化了报表的分类与发布管理。创建新的分类时,只需在指定目录下创建新目录即可,而发布新报表也只需要将报表文件上传到指定目录即可。

    在本实施例中,运行平台实际上就是系统的操作界面。操作员登录后,可看到已发布的各个报表,点击一个报表名称,系统根据该报表中定义的输入参数生成查询条件输入页面。操作员输入查询条件后提交即可看到报表内容。在本实施例中,系统启动时,加载自定义函数声明文件,加载字典表定义、数据源定义等。系统运行时,操作员点击一个自定义报表名称,启动自定义报表引擎(Engine)处理过程:首先根据报表定义文件构造一个报表定义对象(ReportDefine对象),然后根据该定义对象构造一个自定义报表处理引擎(Engine)类实例;从ReportDefine.inputParameters中可得知为该报表定义的自定义查询条件,为每一个查询条件生成对应的查询条件输入控件。最后生成输入各个查询条件的页面。输入完查询条件后提交时,系统按照查询条件中定义的检验方法对输入值进行校验,校验成功才可以提交查询。之后,报表引擎处理提交的查询条件,将所有的参数输入值放入Engine.inputData中,并逐个处理ReportDefine中的数据源定义。处理完数据源定义后,根据ReportDefine中.calData部分的定义,对Engine.data中存放的数据对象进行再计算,比方说产生一些统计数据等。可修改已有对象中的数据,也可产生新数据。新输入一般存入一个新的map中。之后,根据报表样式文件构造一个ExcelEngine对象,然后按照ReportDefine.segmentDatafile中对各区段的数据项定义输出数据到ExcelEngine对象。其中,对于SQL数据源,处理SQL中的嵌入式表达式,得到目标SQL语句,执行查询,得到查询结果,将查询结果DataSet放入Engine.data中;对于Java数据源,通过调用自定义函数,执行一个Java方法。将该方法返回的数据对象放入Engine.data中;对于DSF数据源,首先构造一个DSF对象,然后在该对象上执行查询,将返回的DataSet对象放入Engine.data中。而当绑定整个区段到一个数据对象上的,将数据对象从Engine.data中取出来,直接提交给ExcelEngine对象,生成报表的相应部分。当区段数据项为逐个配置的,首先构造一个新的map,调用自定义函数和嵌入式表达式处理引擎,对数据项配置公式进行计算,将数据项名称和计算结果放入map,该区段的全部数据项都处理完后,将整个map提交给ExcelEngine对象,生成报表的相应部分。

    在输出报表时,如果需要按Html样式将报表内容显示在客户浏览器上,那么调用ExcelEngine的export方法,得到Html格式的报表内容,然后将Html内容写入到response,最终显示在客户浏览器上。一般来说,报表内容应显示在独立的frame里;如果需要生成Excel文件供客户下载到本机,那么调用ExcelEngine的export方法,得到byte[]格式的Excel文件内容,然后将数据直接写入response,客户浏览器就会提示下载或打开Excel文件;如果需要在服务器端生成Excel文件,可调用ExcelEngine.write方法,将报表内容写入到Excel格式的文件中。

    以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

一种自定义报表的生成管理方法及系统.pdf_第1页
第1页 / 共27页
一种自定义报表的生成管理方法及系统.pdf_第2页
第2页 / 共27页
一种自定义报表的生成管理方法及系统.pdf_第3页
第3页 / 共27页
点击查看更多>>
资源描述

《一种自定义报表的生成管理方法及系统.pdf》由会员分享,可在线阅读,更多相关《一种自定义报表的生成管理方法及系统.pdf(27页珍藏版)》请在专利查询网上搜索。

本发明涉及一种自定义报表生成管理方法,用于浏览器/服务器结构,包括如下步骤:在浏览器上调用服务器上运用程序,显示服务器上所有报表清单的报表页面,选择其中一个报表;服务器生成所选报表,传送到所述浏览器。本发明还涉及一种自定义报表生成管理系统。实施本发明的自定义报表的生成管理方法及系统,具有以下有益效果:由于每个报表文件的模板中包括模板文件、样式文件和定义文件,因此,生成报表时报表的格式和报表的数据是。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1