1. 报表制作流程实例:
我们实现一个简单的JasperReports示例,展现其基本的开发、使用流程。Jasper Studio是基于Eclipse的报表设计工具(不熟悉Eclipse的看官先去熟悉一下基本知识吧),默认工作区设置为当前用户主目录下的
JaspersoftWorkspace文件夹,并且不可更改。首先,我们创建一个报表工程,本例中命名为DemoProject,然后创建一张新的报表(File --> New–->Jasper Report),就会出现类似下图所示的窗口让我们选择一个模板。
此例我们选Coffee模板,然后点Next。在接下来的页面里,我们给报表模板起个名字(Demo1.jrxml)并放在DemoProject的根目录下,然后点Next,于是进入了数据源选择界面:
数据源是填充报表的关键,我们必须制定一个数据适配器(Data Adapter),此时我们有三种选择:
1、选择“OneEmpty Record - Empty rows”,这样我们就可以专注于报
表的设计,而暂时不指定数据源,创建完报表之后,我们随时可以制定别的数据源。
2、选择“SampleDB - Database JBDC Connection”,这是Jaspersoft
Studio安装时提供的一个示例数据库。
3、点击“New”按钮创建一个新的数据源。这正是本例要采用的方式,
我们将创建一个连接到本机MySql数据库的world的数据源。
首先点击“New”,在弹出的向导页中选择“Database JDBC Connection”,然后点“Next”弹出下图所示的页面:
配置好基本的数据库连接信息,点击“Test”测试通过之后,一个数据源就配置好了,我们点击“Finish”结束配置。初次配置MySql数据源需要在Driver Classpath页面指定MySql驱动包的路径:
配置并选择数据适配器之后,我们需要指定数据查询的语句,该语句查询出的字段将直接用于报表中的数据字段。本例中我们选出city表中的所有字段:
点击“Next”之后,接下来我们需要选择本报表中用到的字段,本例把city表的所有字段都加入报表:
点击“Next”之后,我们可以选择用来分组的字段,本例中我们选择用国家(CountryCode)来分组:
然后点击”Next”或直接“Finish”即可完成数据源的配置,进入报表设计界面。我们可以看到默认的报表设计界面:
这是Eclipse工作区经典的布局视图,中间部分是报表设计视图,右侧的调色板(Palette)包含了一些报表元素,我们可以方便地把它们拖拽到设计视图中的报表模板上,然后根据需要调整元素的大小、位置和配置信息等。本例中我们将添加一个3D饼状图,这是一个Chart元素,具体方法将在下文介绍。
左下角的大纲(Outline)视图包含了当前编辑的报表的所有基础信息,包括一些固定区域的样式(Style)、报表参数(Parameters)、字段(Fields)等,我们可以方便地查看和修改。大纲视图中还包括报表的一些固定面板的直接链接,比如标头(Title)面板,细节(Detail)面板等。点击一个面板的链接之后,我们可以在右侧的属性视图(Properties)中查看和修改该面板对应的一些基本属性,如高度、布局。
注意:从大纲视图中我们发现,一个报表包含很多固定的面板。在每一个报表中标题和汇总(summary)面板只打印一次,页眉(header)和页脚(footer)在报表的每一页都会打印。我们可以直接在field中新增、删除字段,还可以将字段拖拽到报表的细节面板中,Jasper Studio将会为我们创建一个文本字段(text field)元素,并设置其值为对应字段的数据。文本字段不应出现在除细节面板之外的其它地方。
下面,我们可以预览报表了。在JasperSoftStudio中,我们切换到预览(Preview)视图(点击报表设计视图左下角的“Preview“标签),即可编译、生成、并在报表设计视图展示报表。至此,一个简单的报表就展示在我们面前了:
我们可以看到,最终的报表正如我们在报表设计器中看到的效果一样,只不过Detail面板会根据数据量进行扩展,数据源每查询出一条记录,Detail面板就增加一行。点击报表预览视图右上角的Export按钮,我们还可以选择使用多种文件形式导出报表,包括pdf文件、网页文件、xls文件、cvs文件、甚至ppt等。
通过在Outline视图任意节点右键菜单选择“Dataset and Query…”,或在Outline视图选中报表根节点,在右侧Properties视图选择“Editquery, filter and sort option”菜单均可打开“Dataset and Query”窗口,在这里我们可以修改数据源使用的查询语句,改变或者删改报表中的字段(注意修改查询语句之后,需要点“Read Fields”重新读取字段信息)。本例中,我们做了下图所示的修改:
保存之后回到报表设计视图,我们从Outline的Fields节点将新增加的字段country拖入Detail面板,增加一个“StaticText”元素作为报表的列头,命名为“Country name”,然后调整其它字段内容和列头的样式使其整齐排列,一个新的报表就设计完成了:
点击预览可以看到新报表的效果:
2. 报表制作注意事项:
1、报表制作完成后报表属性中的ignorePagination选项,选择后不分页,有些报表分页会导致格式错误。
2、字体与边框的改动
图中标题TITLE字体大小为16 加粗居中。 报表内容字体大小为10 。标题框高度为50px,包含数字的内容宽度为80px。 边框根据报表情况分割,边框宽度为0.5px
3、汉字显示问题:
字体不要进行改动,一律用默认字体SanSerif,
然后点击图中箭头,选择Advance选项,
找到pdf中pdf encoding 以及 pdf font name,双击从下拉菜单中选择图中选项。
一定要将所有的有或可能涉及到中文的文本框都做上述更改,否则中文在pdf中会不显示。
4、除了少数较小的报表,报表宽度可选择修改纸张尺寸,纸张两侧留白不要超过蓝色格线,主报表四周留20px的margin留白
千万保证框体大小可以完全显示数据,并尽量保证数据显示时不要换行。表格一行高度一般为20px
5、数据框在没有sql数据的情况下可先用空Text Field代替,以便数据进来后方便添加。
6、添加参数变量方法:右键报表选择DataSet and Query 选择下方标签Parameter 点击add添加 添加时注意选择数据类型,类型要对应数据库中相应数据类型。
7、注意Detail框要和表中数据的循环体一样宽,否则会循环多余的空白部分。除了十分确定左侧为数据库读取,否则全部按照定死的方式处理,既全部罗列出来。
8、没用的空白区域可以删掉一面占用空间
9.一列的合计可以放到summary中,若放到Detail中则会每加一行都进行一次计算并显示出来
10.查询为空的结果直接显示为空,选择不要显示null,
11.一个表格可以创建多个Detail循环体 但只能写一个Sql语句,如需要多个语句可以嵌套子报表,子报表命名规范:主报表名+“_subreport1”,若两张子报表则分别用 主报表名+“_subreport1”,主报表名+“_subreport2”命名,依次类推。
12.每个报表都需要一个account参数作为查询条件。主报表接受页面传来的参数,子报表参数全部为主报表向子报表传参。
13这样的分组的报表 航向那一栏的“美洲线”等字段需要调节高度适应band高度,调节方法为在属性中勾选
并在尺寸栏选择
14.报表完成后预览格式应基本与报表Excel相同,并检查确定数据正确性。
15、子报表:
首先制作父报表,就是调用子报表的一个基础报表。
如果父报表中需要显示数据,在SQL编辑器中输入SQL语句,查询出需要的字段,将字段加入到报表中即可。
如果父报表不需要显示任何数据,只是作为子报表的载体,那么也需要在SQL编辑器中输入语句,并且需要能查询出记录,系统才会在生成报表时显示父报表,否则,系统会显示一个空白报表。
一个 SubReport 是一个真正的包含它自己 xml 文件并且是一个已经编译好的 jasper 文件。创建一个 SubReport 就是创建一个普通的报表文件,创建过程中唯一需要注意的是设置SubReport 的宽度、高度及一些不需要显示的 band,一般情况下对于不显示的 band 我们把它们的高度都设置为 0。在设置子报表的宽度时我们应该考虑到它在父报表中显示时的效果,然后针对这一特性有针对性的去设置。
创建一个包含子报表的报表我们需要三个对象:
一个 jasper 文件,
一个包含参数 map(可以为空)
一个 DataSource(数据源,或者是一个 JDBC 的 Connection)。
创建子报表本质与新建一个报表没太大区别,最重要的是调整主、子报表的样式,相互关联和传参。
将一个子报表链接到父报表中需要做三件事情:
获得 SubReport 所对应的 jasper 报表对象、如何为它提供数据及如何为子报表的 parameters 设置具体的值。所有这些信息的定义我们可以通过 SubReport 属性面板下的 SubReport properties 块中参数的设置来实现
创建子报表:
点击组件面板上的“Subreport”按钮,拖动到报表工作区上。
系统会自动弹出子报表选择窗口。可以选择创建一个新报表,还是使用一个已有的报表作为子报表。
选择“Create a new report”,可以立即制作新的子报表;如果选择“Select an existing report”,则可以调用已经有的报表作为子报表;如果选择“Just create the subreport element”,系统会生成一个子报表区,可以在之后挂接需要的子报表。
选择“Create a new report”的,点击 “Next”会出现“选择纸型”界面。
选择完毕,点击“Next”,系统显示文件存储设置页面,在此处设置子报表文件存放在何处。
选择完毕,点击“Next”,系统显示“Data Source”界面。需要在此处选择数据连接,并输入SQL语句,来控制子报表数据的查询范围。
点击“Next”按钮,系统显示“Fields”界面。可以在此处选择子报表中显示的字段。
点击“Next”按钮,系统显示“Group By”界面。可以在此处设置子表的分组字段。
点击“Next”按钮,系统显示“Connection”界面。默认使用与父报表相同的数据连接,也可以选择使用其他指定的数据连接。
点击“Next”按钮,系统显示“Subreport Parameters”界面,在此处可以设置从父表需要传入子表的变量,一般都是关联字段的值。
子报表如果想与父报表联动工作,需要通过参数传递,将父报表中的值传递给子报表。
在“Name”中输入参数的名字,在“Expression”中输入参数的公式。公式可以使用系统的公式生成器自动生成。设定好后。点击“Finish”按钮即可。
系统自动显示子报表界面,如下所示。
可以在此处修改子报表的格式。修改完毕后,保存即可。
在子报表属性窗口的里的“SubReport”标签里的“Parameters Map Expression”属性就是提供给我们的最简单的方法来为子报表设置 parameters 的值,它允许我们定义一个最终可以返回 java.util.Map 对象的表达式,使用这种方法我们可以把从外部应用程序传到父报表里的 parameter 对象,当然这个 parameter 的实际值是一个 java.util.Map 对象传递给子报表使用(比如$P{TestMap}),这里
我们也可以使用内建的报表 parameters:$P{REPORT_PARAMETES_MAP}把子报表中的java.util.Map 对象传递到父报表中供使用。如果该属性我们空着不填那么一个不包含任何值的空的 java.util.Map 将会被传到子报表中。这种机制的局限性是 parameters 里所对应的java.util.Map 值是死的、不会变的。为了克服这种局限性 jasperreport 允许我们定义
parameter键值对的时候每个对象的值通过一个表达式来创建,如在下图中的“SubReport Parameter”表中通过添加个参数 java.util.Map 来填充子报表
16、图形报表以饼图为例 1、 设置报表查询。例如,在查询设置界面中输入如下SQL语句。
2、删除一些报表栏。将columnHeader.detail.colmnFooter等栏高度设置为0。
3、增加Summary栏的高度,设为400。
4、插入饼图,放置在Summary栏。选择如图所示的按钮,插入图形报表。
选择三维饼图。
点击“Next”,设置饼图的参数即可