CN101650711A - 一种报表的生成方法 - Google Patents
一种报表的生成方法 Download PDFInfo
- Publication number
- CN101650711A CN101650711A CN200910109351A CN200910109351A CN101650711A CN 101650711 A CN101650711 A CN 101650711A CN 200910109351 A CN200910109351 A CN 200910109351A CN 200910109351 A CN200910109351 A CN 200910109351A CN 101650711 A CN101650711 A CN 101650711A
- Authority
- CN
- China
- Prior art keywords
- report
- file
- section
- template
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 58
- 230000008859 change Effects 0.000 abstract description 11
- 235000010627 Phaseolus vulgaris Nutrition 0.000 description 13
- 244000046052 Phaseolus vulgaris Species 0.000 description 13
- 230000008569 process Effects 0.000 description 12
- 238000010586 diagram Methods 0.000 description 3
- 230000009471 action Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 230000002950 deficient Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 238000005429 filling process Methods 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000037361 pathway Effects 0.000 description 1
- 238000003825 pressing Methods 0.000 description 1
- 230000011514 reflex Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
Images
Landscapes
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明涉及一种报表的生成方法,所述每种报表包括一个模板文件和一个样式文件,还包括如下步骤:构造与每种报表模板,得到与该报表对应的模板文件和样式文件,并存储;选择报表种类,并读取与报表对应的模板文件和样式文件,加载报表模板;生成报表,并输出。实施本发明的报表的生成方法,具有以下有益效果:由于每个报表都具有与其对应的模板文件和样式文件,因此在生成报表时其表格与表格中的数据是分开的,所以就绝大多数情况而言不需要改动代码、使用方便以及操作简单。
Description
技术领域
本发明涉及电子表格,更具体地说,涉及一种报表的生成方法。
背景技术
电子表格是一种在日常工作中经常使用的工具,其使用的方便程度经常影响使用者对其所在的运用系统的评价。目前应用系统在制作报表时,一般有这样几种方法:一种方法是使用POI,JXL等Excel驱动程序,生成Excel报表对象,然后向指定的单元格写入数据,最后保存为Excel报表文件。但这种方法,程序不仅要提供数据,还要控制各区段的生成以及报表样式、格式,程序代码量大且不直观。在报表样式改变时需要改动代码。另一种方法是使用第三方的报表工具,如iReport,Birt等。这些工具自带设计器,可定义报表的样式,输出格式,数据绑定。在运行时驱动报表引擎生成报表对象,然后提供数据给报表对象即可生成所需报表,并且报表输出支持各种格式。但这种方式需要专用的报表设计工具,这些报表设计工具操作起来比较复杂,并且报表模板的设计也不是基于Excel表格方式的。不方便大部分操作人员的使用。
发明内容
本发明要解决的技术问题在于,针对现有技术的上述需要改动代码、使用不方便或操作较为复杂的缺陷,提供一种基本不需要改动代码、使用方便以及操作简单的一种报表的生成方法。
本发明解决其技术问题所采用的技术方案是:构造一种报表的生成方法,所述每种报表包括一个模板文件和一个样式文件,还包括如下步骤:
A)构造与每种报表模板,得到与该报表对应的模板文件和样式文件,并存储;
B)选择报表种类,并读取与报表对应的模板文件和样式文件,加载报表模板;
C)生成报表,并输出。
在本发明所述的报表的生成方法中,所述步骤A)进一步包括:
A1)用Excel得到所需报表模板样式,生成Excel格式的模板文件;
A2)定义所述报表模板样式中的各区段,生成样式文件。
在本发明所述的报表的生成方法中,步骤A2)中所述定义各区段包括:定义各区段中所要放置的数据项、所述数据项的位置以及所述数据项的显示格式,所述生成样式文件包括将上述信息记录在所述样式文件中。
在本发明所述的报表的生成方法中,所述模板文件包括.xls文件;所述样式文件包括.xml文件。
在本发明所述的报表的生成方法中,所述步骤B)进一步包括:
B1)读取所选报表的样式文件,解析其定义信息,生成报表样式定义对象;
B2)读取所选报表的模板文件,读取其每个区段中的合并单元格信息。
在本发明所述的报表的生成方法中,所述步骤C)进一步包括如下步骤:
C1)构造一个新报表,设置该报表的输出路径;
C2)初始化所构造的新报表;
C3)生成新区段;
C4)填充所述新区段,并输出所述新报表。
在本发明所述的报表的生成方法中,所述步骤C2)进一步包括:
C21)由所述报表模板中复制其表头和表尾到所述新报表;
C22)将新区段插入指针位置设置在所述表头和表位之间。
在本发明所述的报表的生成方法中,所述步骤C)进一步包括如下步骤:
C1)构造一个新报表,设置该报表的输出路径;
C2)初始化所构造的新报表;
C3)生成新区段;
C4)填充所述新区段,并输出所述新报表。
在本发明所述的报表的生成方法中,所述步骤C4)进一步包括如下步骤:
C41)由所述报表定义对象中取得所述报表中各区段单元格所对应的数据项的定义;
C42)从指定的数据对象中获取数据;
C43)处理所述数据;
C44)将所述处理后得到的数据填入其对应的区段单元格中。
在本发明所述的报表的生成方法中,步骤C41)中所述数据项定义包括:数据项名称、所述数据项所在的位置以及所述数据项的显示格式。
实施本发明的报表的生成方法,具有以下有益效果:由于每个报表都具有与其对应的模板文件和样式文件,因此在生成报表时其表格与表格中的数据是分开的,所以就绝大多数情况而言不需要改动代码、使用方便以及操作简单。
附图说明
图1是本发明一种报表的生成方法实施例的报表生成流程图;
图2是所述实施例的报表模板生成流程图;
图3是所述实施例的报表模板加载流程图;
图4是所述实施例中报表生成流程图。
具体实施方式
下面将结合附图对本发明实施例作进一步说明。
如图1所示,在本发明一种报表的生成方法实施例中,从总体上来看,包括了如下步骤:
步骤S1构造报表模板,得到其对应的模板文件和样式文件,存储这些文件:在本步骤中,构建供使用者调用的报表模板,这些报表模板是生成报表的基础,之后的动作都是在此基础上产生的。由于该报表模板分为模板文件和样式文件,因此,其产生报表时,数据与报表式样是分开的,互不相关的,因此其在绝大多数情况下不需要改动代码、使用方便以及操作简单。至于,产生报表模板的具体步骤,稍后有更详细的描述。
步骤S2选择报表,加载其模板:在本步骤中,上述报表模板已经存在,使用者(通常在终端的浏览器上)选择报表模板中的一个,并由服务器中加载该报表模板(报表模板存储在服务器上)。
步骤S3生成报表,并输出:在加载的报表模板上进行数据取得及处理,最后将这些处理后的数据填入对应单元,生成报表,并输出该报表。
图2示出了上述步骤S1中报表模板生成的具体步骤,在图2中,包括:
步骤S11用Excel得到报表模板的样式,生成模板文件:在本实施例中,每个报表模板都需要一个模板文件(Excel文件)和一个样式文件(XML文件),在本步骤中,就是使用Excel画出一个报表模式,这就得到一个.xls格式的模板文件。
步骤S12定义上述模板的样式中的区段,生成样式文件:在本步骤中,将上述模板分好各个区段,设定每个区段中要放置的数据项。以及数据项的位置,显示格式等。将这些配置信息记录在文件中。生成一个样式文件(xml文件)。
通过上述步骤S11和步骤S12,得到一个完整的、包括了模板文件和样式文件的报表模板。多个这样的报表模板存储在一起,就构成了服务器中的报表模板,可在其中选择任何一个模板来生成与其格式一样的报表。
下面具体描述使用者在浏览器上选择具体报表后,其生成报表的过程。
图3示出了上述步骤S2中报表模板加载的具体步骤,在图3中,包括:
步骤S21读取所选报表的样式文件,生成报表样式定义对象:在本步骤中,读取所选报表的样式文件,解析该样式文件中的信息,于是生成报表样式定义对象。
步骤S22读取所选报表的模板文件,得到其中的单元格信息:在本步骤中,读取所选报表的模板文件,取得其区段中每个单元格或合并单元格的信息,完成模板加载。
图4示出了上述步骤S3中报表生成(在上述模板加载完成后)的具体步骤,在图4中,包括:
步骤S30构造一个新报表,设置该报表的输出途径:由本步骤开始,直到步骤S39,都是在描述被选择的报表的生成过程,其中,步骤S31到步骤S32是该报表的初始化过程;步骤S33到步骤S35是描述该报表中生成新区段的过程;步骤S36到步骤S39描述的是将要求的数据填充新区段的过程。在本步骤中,构造一个新的报表,设置报表输出。报表可输出到文件,也可以输出到浏览器。
步骤S31由所述报表模板中复制表头和表尾到新报表中:上述报表中表头、表尾部分是固定的,都只有一个,但分组头、明细、分组尾是按需要生成的。所以初始化报表时从报表模板中复制表头和表尾到新报表。
步骤S32将新区段插入指针设置在上述表头和表尾之间:在本步骤中,设置新区段插入指针在表头和表尾之间的位置,完成报表的初始化。步骤S33在所述新区段位置插入模板文件中的行数:在本步骤中,在新区段插入指针位置处,插入区段定义的行数;这个区段定义的行数也就是模板文件中所定义的行数。
步骤S34以模板文件中的行高设置所插入行的行高:在本步骤中,设置新区段中各行的高度为模板中该区段各行高度。
步骤S35复制模板文件中各单元格信息到所插入的单元格中:在本步骤中,将模板中该区段中各单元格的文字、样式、表格线、合并单元格信息复制到新生成的区段中。
步骤S36取得单元格对应的数据项定义:在本步骤中,由上述报表定义对象(读取报表样式文件时产生的)中获取分别对应于各个单元格的数据项定义。
步骤S37获取数据:因上述步骤已得到数据项的定义,而其定义中有这些数据的所在位置,因此,本步骤中,从提供的数据对象里获取数据。
步骤S38处理所述数据:在上述取得的数据中,按照数据项定义的数据类型、所在单元格位置、格式对数据进行处理。例如可能有些数据需要运算等。
步骤S39将处理后的数据填入对应单元格:将上述处理过的数据填充到目标单元格中,完成该报表的生成。
在本实施例中,实现了基于Excel模板文件的报表生成方法,将报表的样式控制与数据处理完全分开。每个报表有一个模板文件和一个样式文件。ExcelEngine报表引擎(以下简称报表引擎,引擎,或ee)读取报表模板文件,样式文件,得到报表区段与数据项定义。应用程序只需提供数据给报表引擎,报表引擎根据报表定义,生成各个区段,然后对数据进行格式化等处理,填充到报表相应区段的指定位置,最终生成报表文件。
在改变报表样式时只需改动模板文件。如:标题文字,字体,位置,单元格大小,边框。
在改变数据项格式,位置,是否输出时只需改变报表样式文件,无需改动程序。
只有改变报表某区段中包含的数据项(如原来的学生信息报表中没有家长姓名和联系方式,现在需要添加)或数据项所属区段改变时,才需要修改程序,提供新加的数据项。
该引擎可用来生成各种明细表,分组表,卡片表等。
该引擎可向报表中嵌入图片,如各种曲线,直方图,饼图等。
在本实施例中,每个报表都需要一个模板文件(Excel文件)和一个样式文件(XML文件)。制作报表的过程为:
按照需求,用Excel画报表模板。生成一个Excel格式的模板文件(xls文件)。
将模板按以上方式分好各个区段,定好每个区段中要放置的数据项。以及数据项的位置,显示格式等。将这些配置信息记录在样式文件中。生成一个样式文件(xml文件)。
在本实施例中中,一个格式文件的例子为:
普通明细表_操作员清单_style.xml
<?xml version=″1.0″encoding=″UTF-8″?>
<reportdefine>
<report-define
name=″操作员清单″
model_file=″普通明细表_操作员清单.xls″
create_date=″2008-10-30″
title_rows=″5″
group_title_rows=″0″
body_rows=″1″
group_foot_rows=″1″
foot_rows=″0″
print_cols=″B-E″/>
<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>
<report-grouptitle-define>
</report-grouptitle-define>
<report-body-define>
<item name=″getBh″row=″1″col=″b″display=″true″format=″″length=″0″datatype=″c″/>
<item name=″getMc″row=″1″col=″c″display=″true″format=″″length=″0″datatype=″c″/>
<item name=″getGdj″row=″1″col=″d″display=″true″format=″″length=″0″datatype=″c″/>
<item name=″getJs″row=″1″col=″e″display=″true″format=″″length=″0″datatype=″c″/>
</report-body-define>
<report-groupfoot-define>
</report-groupfoot-define>
<report-foot-define>
</report-foot-define>
<report-image
segment =″foot″
row =″1″
col =″b″
height_rows=″10″
width_cols =″5″/>
<remark>
</remark>
</reportdefine>
该文件是一个标准格式的XML文件,其格式符合XML文件格式的要求。以UTF-8作为编码格式。以下对样式文件的内容做一详细说明:
在该文件中,根节点的名称为<reportdefine>。
在本实施例中。<reportdefine>的第一个子结点是<report-define>,该节点是对整个报表的定义,有以下属性:
<report-definename=″操作员清单″-报表名称,如果运行时将报表输出为Excel文件,Excel文件的默认文件名就是报表名称;
model_file=″普通明细表_操作员清单.xls″-使用的模板文件名。模板文件应和样式文件在同一个目录里,文件名称可以不同。但建议起相同的名字以便管理;
create_date=″2008-10-30″ -创建日期。非关键属性;
title_rows=″5″ -表头行数;
group_title_rows=″0″ -分组头行数;
body_rows=″1″ -表体行数;
group_foot_rows=″1″ -分组尾行数;
foot_rows=″0″ -表尾行数;
print_cols=″B-E″/> -打印列范围。
第一列的列号-最末列列号(使用Excel的ABC样式表示列号而不要使用123),一般可指定第一列到最后一个有数据的列,以便报表引擎处理报表模板时,忽略右边那些没有内容的列,可加快运行速度。
以上5个区段,如果某个区段没有,则对应区段行数=0
在本实施例中,定义了报表的属性后,还需要定义各个区段的如下数据项:
<report-title-define> -表头区数据项定义
<report-grouptitle-define> -分组头区数据项定义
<report-body-define> -表体区数据项定义
<report-groupfoot-define> -分组尾区数据项定义
<report-foot-define> -表尾区数据项定义
其中,如某个区段中无数据项,对应节点无子结点。
对于<report-grouptitle-define>,<report-body-define>,<report-groupfoot-define>节点,可以有以下两个属性:addpagebreak,ignorefirst。如:<report-body-define addpagebreak=″true″ignorefirst=″true″>。其中,addpagebreak:取值为”true”/”false”,如果省略,则默认为”false”。每次生成一个新的区段时,是否在该区段前边添加一个换页符。这种情况对打印发票这种固定大小的的报表特别有用。比如,要打印多个用户的费用清单,每个用户的费用清单使用固定大小的打印纸,那么可以把报表的纸张大小定义为自定义大小,然后在生成每个用户的清单时,给前边添加一个换页符,这样每次打印完一个用户的信息,打印机都会强行换页,保证下一个用户信息打印在新的一页纸上。此外,ignorefirst:取值为”true”/”false”,如果省略,则默认为”true”。只有当addpagebreak=true时,ignorefirst才起作用。表示第一个生成的区段前是否忽略分页符。
一般而言,对Excel文件来说,填到每个单元格的数据项有三种数据类型:字符串型,数字型,日期时间型。对字符串来说一般是原样填充,对数字型和日期时间型可在Excel模板文件里设置显示格式,只有在Excel里不支持的格式化,才需要在程序进行格式化处理。
Excel表格中还可以设置各种计算公式,比如总价=单价*数量,这种情况下,单价和数量都要以数字方式填充到单元格中,Excel才能正确的计算。
在本实施例中,如果某区段中有数据项,数据项按以下格式配置:<itemname=″title″row=″2″col=″b″display=″true″datatype=″c″format=″%1$s操作员清单″format_data_type=″c″length=″0″/>
其中:
name:数据项名称,string;
row:在所在区段中的相对行号,行号从1开始。int,取值范围:1-该区段行数;
col:所在列,使用ABC样式的列号表示。string,取值范围:A-打印列的最末列列号;
display:是否显示,如果为false,则引擎运行时该数据不填充到模板中。Boolean,取值“true”/”false”;
datatype:数据类型,String,可选值为c/n/d。即字符型/数字型/日期型,如果不能确定数据类型的话,可选择字符型,这样数据会原样填到报表中;如果选择数字型或日期型,那么数据会按照数字或日期方式填到表格中。
format:格式化字符串。String。如果不需要对该数据进行格式化处理,则format为空(空字符串-””)。如果数据类型指定为字符型,format参数才起作用。format的的格式应符合Java中format函数的语法。具体语法请参阅Java相关文档。
对于“%1$s操作员清单”这样的格式字符串的解释如下:%1$s表示第一个参数的占位符。比如运行时该数据项的值是“南山供电局”,那么使用“%1$s操作员清单”对“南山供电局”进行格式化后的结果是“南山供电局操作员清单”,即运行时使用该数据项的值替换格式字符串中的占位符。
format_data_type:格式化数据时按什么方式。String,可选值c/n/d。该属性只有在数据类型为字符型且format属性不为空时才需要配置。
format_data_type属性指明对数据进行格式化时,按照哪种数据类型进行格式化处理。C--字符型,n--数字型,d--日期型。如果数据类型错误,那么格式化过程会出错。
length:数据填充长度,int型,取值范围>=0,以字节为单位。(注意:一个汉字为两个字节)。该属性只有在数据类型为字符型时起作用。如果length=0,数据按实际长度填到单元格里。如果>0,则判断数据长度是否超出length,如果超出的话会截断。在某些报表中,单元格的大小是固定的,只能容纳有限个字符,这种情况下可使用length属性来将超出的字符截断。
对于某些图文并茂的报表,比如报表上部是表格,下边需要输出一个chart,这种时候需要给报表定义一个特殊的区段-图片段<report-image>。运行时,可将其他程序生成的图片输出到如果报表中<report-image>定义的位置。如果不需要图片,可以没有<report-image>节点。
<report-image
segment =″foot″
row =″1″
col =″b″
height_rows=″10″
width_cols=″5″/>
其中:
segment:图片所属区段,String,可选值title/group_title/body/group_foot/foot;
row:图片在所定义区段中的位置。行号,int,取值范围:1-所属区段的行数;
col:图片在所定义区段中的位置。列号,String,ABC样式的列号。取值范围:A-打印范围的最末列;
height_rows:图片占的行数,int,取值范围:row+height_rows应小于所属区段的行数;
width_cols:图片占的列数,int,取值范围:col+width_cols应小于打印范围的最末列;
实际上,图片输出到报表后,将占据从第row行上边沿,第col列左边沿,height_rows行高,width_cols列宽的一个范围。并且在用户拖动改变行高列宽时,图片的大小也将跟着改变。例如:普通报表,上边是明细表格,最后输出一个Chart图片。可将图片定义在foot区;分组报表,每个分组中都需要有自己的Chart图片,可将图片定义在group_foot区。
此外,在本实施例中,<remark></remark>节点中还可以写一些备注信息。
在本实施例中,上述报表的实现过程如下:
首先,在ExcelEngine(报表引擎)软件包里计划实现以下几个类:
其中,报表样式定义部分包括:
ReportStyleDefine:Bean,报表样式定义对象
Segment:Bean,报表区段定义;
SegType:枚举,报表区段类别;
DataItem:Bean,报表数据项定义;
ImageDefine:Bean,图片定义;
MergeRange:Bean,合并单元格定义;
而报表处理引擎部分包括:ExcelEngine:报表引擎类上述各个类的结构描述如下:
ReportStyleDefine类的基础数据结构如下表:
String | createDate创建日期 |
int | endCol结束列号 |
ImageDefine | imageDefine报表中定义的图片。 |
String | modelFileName模板文件名 |
Sheet | modelSheet模板sheet对象,只读 |
Workbook | modelWorkBook模板workbook对象,只读 |
String | name报表的名字 |
HashMap<SegType,Segm ent> | segments报表中各区段的定义对象,Title,GroupTitle,Body,GroupFoot,Foot五个段每个都会在map中放一个实例SegType:区段类别Segment:区段实例 |
int | startCol起始列号(第一列从0开始) |
String | styleFileName样式文件名 |
Segment类的基础数据结构如下表:
ArrayList<DataItem> | dataItems该区段中定义的数据项如果区段的行数定义为0,那么区段中不应定义数据项。 |
boolean | isAddPageBreak生成新的该区段时,是否在前边添加一个RowPageBreak(行分页符) |
boolean | isIgnoreFirst如果在生成新区段时需要在之前添加行分页符,如果该区段是首次生成,是否不添加行分页符。 |
ArrayList<MergeRange> | mergeRange该区段中包含的合并单元格的定义注意报表定义时,合并单元格不应跨区段。 |
int | rows行数 |
int | startRow在模板中的起始行数,从0开始 |
SegType | type区段类别 |
DataItem对象的基础数据结构如下表:
int | col在所属区段的相对列数,从0开始 |
DataType | dataType数据类型。 |
String | format数据格式化串,为空时不对数据进行格式化 |
DataType | formatDataType格式化数据的类别。 |
boolean | isFill是否填充数据 |
int | length字符型数据填充长度(以字节为单位。 |
String | name数据项名称 |
int | row在所属区段的相对行数,从0开始 |
在本实施例中,当上述各个类建立后,开始读取模板文件及样式文件:报表引擎读取样式定义文件,解析报表定义信息,生成一个报表样式定义对象ReportStyleDefine;读取报表模板文件,将模板文件中的第一页当作模板。读取每个区段中的合并单元格信息。如果某个合并单元格跨了不同的区段,那么解析过程失败,抛出异常。至此,加载模板过程结束。
当上述加载模板完成后,开始生成报表,即构造一个新的报表,设置报表输出。可输出到文件,也可以输出到浏览器response(在Web应用时比较方便)。初始化报表对象。报表中表头、表尾部分是固定的,只有一个,但分组头、明细、分组尾是按需要生成的。所以初始化报表时从报表模板中复制表头和表尾到新报表。并设置新区段插入指针是表头和表尾之间的位置。
之后,开始填充各区段数据,报表引擎提供了各种方法接受以下格式的数据:
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对象的集合。
LIST_MAP,-Java List<Map>对象。List中的每个元素是一个Map。
DATASET,-数据集对象。类似于ResaultSet。其中可包含多条记录。
GROUP_MAP;-Java Map<Bean1,List<Bean2>>对象。一般用来给分组报表提供数据。Bean1用来提供分组的数据,List<Bean2>用来给该分组的明细区提供数据。
在上述填充过程中,生成一个新的区段,然后从报表定义对象里获取各个数据项定义,从提供的数据对象里获取数据。再按照数据项定义的数据类型、所在单元格位置、格式对数据进行处理,处理完后填充到目标单元格中。
其中,生成一个新的区段由包括:生成新区段的过程:如果要生成的区段是表头、表尾,则忽略生成区段的过程。因为表头表尾已存在了;在新区段插入指针位置处,插入区段定义的行数;设置新区段中各行的高度为模板中该区段各行高度;将模板中该区段中各单元格的文字、样式、表格线、合并单元格信息复制到新生成的区段中。如果该区段需要添加换页符,则在区段顶端添加换页符。
其中,新区段插入指针=新区段插入指针+新区段行数;
填充数据:从该区段定义对象segment.dataItems中可得知该全段中各个数据项的配置信息。
如果提供的数据为Bean,那么dataItem.name实际上对应的是Bean的某个方法名,利用Java反射机制,访问`Bean的某个方法,获得数据;
如果提供的数据为Array或List,那么按dataItem在dataItems中的index,从Array或List中获得数据;
如果提供的数据为DataSet,那么dataItem.name实际上是字段名,按字段名从DataSet中获取数据;
如果提供的数据为Map,那么dataItem.name实际上是Map.key,按key到Map中获得指定的数据;
在获得数据后,就可以按照dataItem的其他属性对数据进行处理,然后填充。
如果dataItem.isFill=false,则不填充该数据项;
按dataItem的数据类型对数据进行类型转换,转换为字符型/数字型/日期时间型,然后按不同类型填充到区段的对应位置。位置属性为dataItem.row和dataItem.col。
遍历segment.dataItems中的各个数据项,逐个进行填充;
如果提供的数据为DataSet,List<Bean>,List<Map>这种包含多个数据对象的集合,那么就会逐个生成多个区段。比如明细区中的多行记录。
对于分组报表,有以下两种快捷数据填充方式:调用fillGroup_And_Body(DataSet groupDS,DataSet bodyDS,StringfilterFieldName)方法填充;其中:groupDS是分组数据集对象;bodyDS是分组明细区数据集对象;filterFieldName是分组数据对象和明细数据对象的关联字段。引擎首先在groupDS中遍历每条记录,为每条记录生成一个分组头,然后按关联字段的值,到bodyDS中搜索符合条件的记录,然后生成多个分组明细记录。第二种方法调用fillGroup_And_Body(LinkedHashMap<Object,ArrayList<Object>>map)方法填充;其中map.key Bean,为分组头和分组尾提供数据;mep.value Lisyt<Bean>,为该分组的明细区提供数据。
各区段数据都写入报表后,将报表内容写入文件,然后关闭打开的文件,释放资源。至此报表制作过程结束。
综上所述,本发明解决了在J2EE平台下报表制作时数据和样式控制完全分离的问题,使用Excel文件作为报表模板的问题。可在各种管理信息系统中生成报表时使用。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
Claims (10)
1、一种报表的生成方法,其特征在于,所述每种报表包括一个模板文件和一个样式文件,还包括如下步骤:
A)构造与每种报表模板,得到与该报表对应的模板文件和样式文件,并存储;
B)选择报表种类,并读取与报表对应的模板文件和样式文件,加载报表模板;
C)生成报表,并输出。
2、根据权利要求1所述的报表的生成方法,其特征在于,所述步骤A)进一步包括:
A1)用Excel得到所需报表模板样式,生成Excel格式的模板文件;
A2)定义所述报表模板样式中的各区段,生成样式文件。
3、根据权利要求2所述的报表的生成方法,其特征在于,步骤A2)中所述定义各区段包括:定义各区段中所要放置的数据项、所述数据项的位置以及所述数据项的显示格式,所述生成样式文件包括将上述信息记录在所述样式文件中。
4、根据权利要求3所述的报表的生成方法,其特征在于,所述模板文件包括.xls文件;所述样式文件包括.xml文件。
5、根据权利要求4所述的报表的生成方法,其特征在于,所述步骤B)进一步包括:
B1)读取所选报表的样式文件,解析其定义信息,生成报表样式定义对象;
B2)读取所选报表的模板文件,读取其每个区段中的合并单元格信息。
6、根据权利要求5所述的报表的生成方法,其特征在于,所述步骤C)进一步包括如下步骤:
C1)构造一个新报表,设置该报表的输出路径;
C2)初始化所构造的新报表;
C3)生成新区段;
C4)填充所述新区段,并输出所述新报表。
7、根据权利要求6所述的报表的生成方法,其特征在于,所述步骤C2)进一步包括:
C21)由所述报表模板中复制其表头和表尾到所述新报表;
C22)将新区段插入指针位置设置在所述表头和表位之间。
8、根据权利要求7所述的报表的生成方法,其特征在于,所述步骤C3)进一步包括如下步骤:
C31)在所述新区段插入指针位置插入模板文件中所述区段定义的行数;
C32)用所述模板文件中定义该区段的行高来定义所述新区段的行高;
C33)将所述模板文件中该区段中各单元格的信息复制到所述新区段中。
9、根据权利要求8所述的报表的生成方法,其特征在于,所述步骤C4)进一步包括如下步骤:
C41)由所述报表定义对象中取得所述报表中各区段单元格所对应的数据项的定义;
C42)从指定的数据对象中获取数据;
C43)处理所述数据;
C44)将所述处理后得到的数据填入其对应的区段单元格中。
10、根据权利要求9所述的报表的生成方法,其特征在于,步骤C41)中所述数据项定义包括:数据项名称、所述数据项所在的位置以及所述数据项的显示格式。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910109351A CN101650711A (zh) | 2009-08-18 | 2009-08-18 | 一种报表的生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910109351A CN101650711A (zh) | 2009-08-18 | 2009-08-18 | 一种报表的生成方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101650711A true CN101650711A (zh) | 2010-02-17 |
Family
ID=41672950
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200910109351A Pending CN101650711A (zh) | 2009-08-18 | 2009-08-18 | 一种报表的生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101650711A (zh) |
Cited By (36)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102024039A (zh) * | 2010-12-01 | 2011-04-20 | 北京神州泰岳软件股份有限公司 | 基于eoms系统的表单生成方法 |
CN102722533A (zh) * | 2012-05-09 | 2012-10-10 | 浙江图讯科技有限公司 | 一种报表展现与填报的方法及系统 |
CN102810094A (zh) * | 2011-05-31 | 2012-12-05 | 中兴通讯股份有限公司 | 报表生成方法及装置 |
CN102855650A (zh) * | 2012-07-24 | 2013-01-02 | 力合科技(湖南)股份有限公司 | 一种生成报表的方法及系统 |
CN103136174A (zh) * | 2011-11-24 | 2013-06-05 | 北大方正集团有限公司 | 一种生成报表的方法和装置 |
CN103914933A (zh) * | 2012-12-30 | 2014-07-09 | 航天信息股份有限公司 | 一种基于xml技术的发票打印方法和装置 |
CN103914438A (zh) * | 2012-12-30 | 2014-07-09 | 航天信息股份有限公司 | 基于模版与标记实现的Excel显示与导出方法及系统 |
CN104252440A (zh) * | 2013-10-08 | 2014-12-31 | 深圳市华傲数据技术有限公司 | 一种单元格字体处理方法和装置 |
CN104391832A (zh) * | 2014-11-18 | 2015-03-04 | 浪潮电子信息产业股份有限公司 | 一种利用vba实现多个excel数据表合并数据的方法 |
CN104572048A (zh) * | 2013-10-18 | 2015-04-29 | 镇江鼎拓科技信息有限公司 | 一种jsp环境中基于xml的excel报表生成方法 |
CN104679452A (zh) * | 2013-12-02 | 2015-06-03 | 航天信息股份有限公司 | 一种税控系统中发票打印数据绑定方法 |
CN104881275A (zh) * | 2015-02-11 | 2015-09-02 | 中国农业银行股份有限公司 | 一种电子报表生成方法及装置 |
CN105426465A (zh) * | 2015-11-13 | 2016-03-23 | 中国建设银行股份有限公司 | 联机导出报表的方法及装置 |
CN105741035A (zh) * | 2016-01-28 | 2016-07-06 | 浪潮通用软件有限公司 | 一种erp系统数据整合的方法及装置 |
CN105843784A (zh) * | 2016-03-18 | 2016-08-10 | 中国银行股份有限公司 | 一种报表生成方法及装置 |
CN105955944A (zh) * | 2016-05-09 | 2016-09-21 | 杭州艺豆网络科技有限公司 | 一种尺码表的生成方法 |
CN106095992A (zh) * | 2016-06-21 | 2016-11-09 | 浪潮通用软件有限公司 | 一种ERP数据与Excel文档数据交换的方法 |
CN106407172A (zh) * | 2016-11-21 | 2017-02-15 | 成都鼎桥通信技术有限公司 | 一种基于xml的报表生成方法 |
CN106886484A (zh) * | 2017-02-22 | 2017-06-23 | 郑州云海信息技术有限公司 | 基于云海系统的报表生成方法和装置 |
CN106933899A (zh) * | 2015-12-30 | 2017-07-07 | 远光软件股份有限公司 | 表格处理方法及装置 |
CN107169294A (zh) * | 2017-05-22 | 2017-09-15 | 中国电子科技集团公司第四十研究所 | 一种环境试验自动测试系统中Excel报表二次判断处理方法 |
CN102215126B (zh) * | 2011-06-08 | 2017-11-03 | 中兴通讯股份有限公司 | 性能报表的生成方法及装置 |
CN107608950A (zh) * | 2016-07-11 | 2018-01-19 | 陈鹏 | 一种生成电子报表的方法 |
CN108334483A (zh) * | 2017-12-25 | 2018-07-27 | 山东浪潮通软信息科技有限公司 | 一种Word文档中填充数据的方法和装置 |
WO2018145635A1 (zh) * | 2017-02-08 | 2018-08-16 | 深圳壹账通智能科技有限公司 | 文件生成方法、装置、服务器和存储介质 |
CN109298858A (zh) * | 2018-10-25 | 2019-02-01 | 北京航天时代激光导航技术有限责任公司 | 一种基于Qt资源文件的Excel文档生成方法及系统 |
CN109388612A (zh) * | 2018-09-14 | 2019-02-26 | 中国科学院光电研究院 | 一种数据汇总文档生成的方法、设备、系统及介质 |
CN109800264A (zh) * | 2018-12-27 | 2019-05-24 | 平安科技(深圳)有限公司 | 多样化申报表导出方法、装置及存储介质 |
CN110852055A (zh) * | 2019-11-07 | 2020-02-28 | 北京宝兰德软件股份有限公司 | 基于JasperReport的报表生成方法及装置 |
CN110866383A (zh) * | 2019-10-15 | 2020-03-06 | 中国直升机设计研究所 | 一种交互式电子数据清单生成方法及系统 |
CN111338827A (zh) * | 2020-03-20 | 2020-06-26 | 北京字节跳动网络技术有限公司 | 表格数据的粘贴方法、装置以及电子设备 |
CN112000644A (zh) * | 2020-08-21 | 2020-11-27 | 北京浪潮数据技术有限公司 | 一种数据处理方法、系统及电子设备和存储介质 |
CN112434505A (zh) * | 2020-11-24 | 2021-03-02 | 文思海辉智科科技有限公司 | 一种模板生成方法、装置、计算机设备和存储介质 |
CN112528247A (zh) * | 2020-12-03 | 2021-03-19 | 四川新网银行股份有限公司 | 一种用于银行业的高效率高安全性报表分发方法与装置 |
CN113344530A (zh) * | 2021-06-10 | 2021-09-03 | 夏果夫 | 一种利用excel快速制作建筑施工支架的方法 |
CN109800264B (zh) * | 2018-12-27 | 2024-05-31 | 平安科技(深圳)有限公司 | 多样化申报表导出方法、装置及存储介质 |
-
2009
- 2009-08-18 CN CN200910109351A patent/CN101650711A/zh active Pending
Cited By (46)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102024039A (zh) * | 2010-12-01 | 2011-04-20 | 北京神州泰岳软件股份有限公司 | 基于eoms系统的表单生成方法 |
CN102024039B (zh) * | 2010-12-01 | 2012-09-05 | 北京神州泰岳软件股份有限公司 | 基于eoms系统的表单生成方法 |
CN102810094A (zh) * | 2011-05-31 | 2012-12-05 | 中兴通讯股份有限公司 | 报表生成方法及装置 |
CN102215126B (zh) * | 2011-06-08 | 2017-11-03 | 中兴通讯股份有限公司 | 性能报表的生成方法及装置 |
CN103136174A (zh) * | 2011-11-24 | 2013-06-05 | 北大方正集团有限公司 | 一种生成报表的方法和装置 |
CN102722533A (zh) * | 2012-05-09 | 2012-10-10 | 浙江图讯科技有限公司 | 一种报表展现与填报的方法及系统 |
CN102855650A (zh) * | 2012-07-24 | 2013-01-02 | 力合科技(湖南)股份有限公司 | 一种生成报表的方法及系统 |
CN103914933A (zh) * | 2012-12-30 | 2014-07-09 | 航天信息股份有限公司 | 一种基于xml技术的发票打印方法和装置 |
CN103914438A (zh) * | 2012-12-30 | 2014-07-09 | 航天信息股份有限公司 | 基于模版与标记实现的Excel显示与导出方法及系统 |
CN104252440A (zh) * | 2013-10-08 | 2014-12-31 | 深圳市华傲数据技术有限公司 | 一种单元格字体处理方法和装置 |
CN104252440B (zh) * | 2013-10-08 | 2017-05-17 | 深圳市华傲数据技术有限公司 | 一种单元格字体处理方法和装置 |
CN104572048A (zh) * | 2013-10-18 | 2015-04-29 | 镇江鼎拓科技信息有限公司 | 一种jsp环境中基于xml的excel报表生成方法 |
CN104679452A (zh) * | 2013-12-02 | 2015-06-03 | 航天信息股份有限公司 | 一种税控系统中发票打印数据绑定方法 |
CN104679452B (zh) * | 2013-12-02 | 2018-04-20 | 航天信息股份有限公司 | 一种税控系统中发票打印数据绑定方法 |
CN104391832A (zh) * | 2014-11-18 | 2015-03-04 | 浪潮电子信息产业股份有限公司 | 一种利用vba实现多个excel数据表合并数据的方法 |
CN104881275A (zh) * | 2015-02-11 | 2015-09-02 | 中国农业银行股份有限公司 | 一种电子报表生成方法及装置 |
CN104881275B (zh) * | 2015-02-11 | 2018-08-28 | 中国农业银行股份有限公司 | 一种电子报表生成方法及装置 |
CN105426465A (zh) * | 2015-11-13 | 2016-03-23 | 中国建设银行股份有限公司 | 联机导出报表的方法及装置 |
CN106933899A (zh) * | 2015-12-30 | 2017-07-07 | 远光软件股份有限公司 | 表格处理方法及装置 |
CN105741035A (zh) * | 2016-01-28 | 2016-07-06 | 浪潮通用软件有限公司 | 一种erp系统数据整合的方法及装置 |
CN105843784A (zh) * | 2016-03-18 | 2016-08-10 | 中国银行股份有限公司 | 一种报表生成方法及装置 |
CN105955944A (zh) * | 2016-05-09 | 2016-09-21 | 杭州艺豆网络科技有限公司 | 一种尺码表的生成方法 |
CN106095992B (zh) * | 2016-06-21 | 2019-07-05 | 浪潮通用软件有限公司 | 一种ERP数据与Excel文档数据交换的方法 |
CN106095992A (zh) * | 2016-06-21 | 2016-11-09 | 浪潮通用软件有限公司 | 一种ERP数据与Excel文档数据交换的方法 |
CN107608950A (zh) * | 2016-07-11 | 2018-01-19 | 陈鹏 | 一种生成电子报表的方法 |
CN106407172A (zh) * | 2016-11-21 | 2017-02-15 | 成都鼎桥通信技术有限公司 | 一种基于xml的报表生成方法 |
CN106407172B (zh) * | 2016-11-21 | 2019-06-07 | 成都鼎桥通信技术有限公司 | 一种基于xml的报表生成方法 |
WO2018145635A1 (zh) * | 2017-02-08 | 2018-08-16 | 深圳壹账通智能科技有限公司 | 文件生成方法、装置、服务器和存储介质 |
US10802804B2 (en) | 2017-02-08 | 2020-10-13 | One Connect Smart Technology Co., Ltd. | File generation method, device, server, and storage medium |
CN106886484A (zh) * | 2017-02-22 | 2017-06-23 | 郑州云海信息技术有限公司 | 基于云海系统的报表生成方法和装置 |
CN107169294A (zh) * | 2017-05-22 | 2017-09-15 | 中国电子科技集团公司第四十研究所 | 一种环境试验自动测试系统中Excel报表二次判断处理方法 |
CN108334483A (zh) * | 2017-12-25 | 2018-07-27 | 山东浪潮通软信息科技有限公司 | 一种Word文档中填充数据的方法和装置 |
CN109388612B (zh) * | 2018-09-14 | 2021-01-15 | 中国科学院光电研究院 | 一种数据汇总文档生成的方法、设备、系统及介质 |
CN109388612A (zh) * | 2018-09-14 | 2019-02-26 | 中国科学院光电研究院 | 一种数据汇总文档生成的方法、设备、系统及介质 |
CN109298858A (zh) * | 2018-10-25 | 2019-02-01 | 北京航天时代激光导航技术有限责任公司 | 一种基于Qt资源文件的Excel文档生成方法及系统 |
CN109800264A (zh) * | 2018-12-27 | 2019-05-24 | 平安科技(深圳)有限公司 | 多样化申报表导出方法、装置及存储介质 |
CN109800264B (zh) * | 2018-12-27 | 2024-05-31 | 平安科技(深圳)有限公司 | 多样化申报表导出方法、装置及存储介质 |
CN110866383A (zh) * | 2019-10-15 | 2020-03-06 | 中国直升机设计研究所 | 一种交互式电子数据清单生成方法及系统 |
CN110866383B (zh) * | 2019-10-15 | 2023-09-19 | 中国直升机设计研究所 | 一种交互式电子数据清单生成方法及系统 |
CN110852055A (zh) * | 2019-11-07 | 2020-02-28 | 北京宝兰德软件股份有限公司 | 基于JasperReport的报表生成方法及装置 |
CN111338827A (zh) * | 2020-03-20 | 2020-06-26 | 北京字节跳动网络技术有限公司 | 表格数据的粘贴方法、装置以及电子设备 |
CN112000644B (zh) * | 2020-08-21 | 2022-08-02 | 北京浪潮数据技术有限公司 | 一种数据处理方法、系统及电子设备和存储介质 |
CN112000644A (zh) * | 2020-08-21 | 2020-11-27 | 北京浪潮数据技术有限公司 | 一种数据处理方法、系统及电子设备和存储介质 |
CN112434505A (zh) * | 2020-11-24 | 2021-03-02 | 文思海辉智科科技有限公司 | 一种模板生成方法、装置、计算机设备和存储介质 |
CN112528247A (zh) * | 2020-12-03 | 2021-03-19 | 四川新网银行股份有限公司 | 一种用于银行业的高效率高安全性报表分发方法与装置 |
CN113344530A (zh) * | 2021-06-10 | 2021-09-03 | 夏果夫 | 一种利用excel快速制作建筑施工支架的方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101650711A (zh) | 一种报表的生成方法 | |
CN111753500B (zh) | 版式化后的电子表单与ofd合并展现及目录生成的方法 | |
CN101122899B (zh) | 报表的生成方法和设备 | |
CN102609256B (zh) | 一种基于网页的动态图表生成方法 | |
CN104881275B (zh) | 一种电子报表生成方法及装置 | |
CN101308490B (zh) | 一种动态报表生成方法及平台 | |
CN101025738B (zh) | 一种免模板动态网站生成方法 | |
CN105302550A (zh) | 将页面转为版式数据流文件的方法及系统 | |
CN102646039A (zh) | 基于XML Schema的软件界面生成系统及方法 | |
JPWO2006046523A1 (ja) | 文書解析システム、及び文書適応システム | |
CN103136317A (zh) | 工程管理系统工程合同在线审批信息化实现方法 | |
CN109634992B (zh) | 一种报表结构分解方法、报表生成方法、装置 | |
US7856428B2 (en) | Method, computer program product and device for importing a plurality of data sets into a system | |
CN114035773A (zh) | 一种基于配置的低代码开发表单方法、系统及装置 | |
CN106021394A (zh) | 一种网站的建站方法和装置 | |
CN101146281A (zh) | 一种面向移动终端的创建图形用户界面模型 | |
CN111309313A (zh) | 一种快速生成html以及存储表单数据的方法 | |
CN115712413B (zh) | 低代码开发方法、装置、设备及存储介质 | |
CN106294299A (zh) | 一种报表生成方法及装置 | |
KR102358855B1 (ko) | 웹 페이지를 생성하는 방법 및 장치 | |
CN102663198A (zh) | 一种web后台与前台结合的在线设计制作印制品的方法及系统 | |
CN106339363A (zh) | 一种ppt报告的制作方法和装置 | |
US20070061349A1 (en) | Hierarchically describing shapes | |
CN105468571A (zh) | 一种用于自动生成报告的方法及装置 | |
CN106407172A (zh) | 一种基于xml的报表生成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Open date: 20100217 |