1、行式报表即清单式明细表,是常见也是简单的报表样式,如下图效果:行式报表利用了报表当中的纵向扩展属性,展现了一个列表式的表格,该节通过介绍行式报表的实现过程来体验数据的扩展。。
2、 准备数据数据准备包括两步,准备数据连接和数据集,FineReport安装exe的时候会内置一个名为FRDemo的数据连接,连接的是工程下的一个WebReport的ACCESS数据库,接下来文档中所有的示例数据全部来源于该数据库。连接数据库FRDemo,我们使用内置数据库表订单来制作一张订单列表。新建工作薄,添加数据集dsSQL语句为SELECT*FROM订单。。
3、模板设计表样设计根据实际情况设计表样,如下图:。
4、字段绑定根据表样中的字段标题将数据集中的字段拖曳至相应单元格中,如下图:。
5、数据显示方式FineReport数据显示有3种方式:列表、分组和汇总。。
6、列表:如上效果图所示,即数据以列表的方式展示,不做任何分组处理;分组:指后面的单元格会根据前面的单元格的数据,进行数据过滤分组,合并相同项显示;汇总:指对单元格中的数据进行汇总计算,汇总包括求和、平均、大值、小值和个数,只针对单元格中字段时数值类型的单元格。在效果图中看到行式报表是以列表的方式展示的,故需设置订单ID字段的数据显示方式设置为列表。注:只需要将左边的单元格订单ID的显示方式设置为列表即可,在父子格中介绍了,单元格会默认将其左侧纵向扩展的单元格作为父格,那么A2是B2的父格,B2是C2的父格,以此类推,经过数据传递,可以看到所有的单元格的父格均是订单ID所在的A2单元格,所以只需要将A2的数据显示方式设置为列表,其他的单元格会跟随该单元格来显示数据。。
7、单元格样式设置由于数据库中运货费的是小数形式,为了整齐美观,可设置其数据格式保留两位小数,选中F2单元格,在右侧下方的单元格属性表中选择单元格属性表-样式,在格式里面选择数字,并设置其保留两位小数,如下图:。
8、分组报表就是将报表中的数据按组显示,即将数据列中相同项合并为一组显示,如下图简单的分组报表:。
9、新建报表,添加数据集新建工作簿,添加数据集,SQL语句为:SELECT*FROM[销量]。。
10、拖拽数据列将数据列拖拽入相应单元格(默认的就是分组显示,因此不需要做其他设置),如下图所示:设置销量数据列为汇总-求和,其余默认。预览便可看到上方的分组效果了。。
11、总结由该例子可以看出:拖拽的数据列默认就是分组显示的,会将相同项合并起来;数据列在同一行时,会产生默认的父格关系:同行的单元格会以其左侧相邻的扩展格为父格,就如这边销售员默认父格为地区,销量默认父格为销售员;数据列在同一行且来自于同一数据集时,子格会自动将父格作为过滤条件,形成一种附属关系,就如这边销售员会自动罗列在所属地区下。。
12、交叉表,也是常见的基本报表类型,分组报表只是从上到下将数据分组显示,而交叉表则是从上到下、从左到右都将数据分组的报表,如下图:FineReport天然支持行列对称,设计交叉表的方法也很简单。。
13、新建工作簿,添加数据集新建工作薄,添加数据集dsSQL语句为SELECT*FROM[销量]。。
14、制作交叉表设计好表样后,将数据列拖入对应单元格:。
15、纵表头:地区与销售员默认纵向扩展实现从上到下分组;横表头:将产品类型与产品设置为从左到右扩展,让产品横向分组,实现横表头;数据:根据父子格的概念,销量会以销售员为左父格,产品为上父格,自动匹配出销售员与产品对应的销量。预览即可看到上图交叉表。注:此处销售员与产品对应的销量是的,因此,直接将销量拖入单元格即可。。
16、内置的数据库中有一张雇员表,他有很多字段,这些字段都要显示在报表中,如果把它显示在报表的一行上,看起来会很拥挤,如果报表中要显示图片字段,把图片和非图片字段都显示在报表的同一行上,会严重的影响报表的美观,这个时候就可以做成自由格式的报表。如下面的订单统计自由报表:。
17、可以看到,自由报表不像网格式报表或者分组报表那样规则,其特点是数据库表中的一条记录不是分布在一行上,而是散放在多行上,记录分块或者分页显示,以提高报表的可读性和美观性。。
18、新建工作簿,添加数据集新建工作薄,添加数据集dsSQL语句为SELECT*FROM[订单]。。
19、表样设计自由格式报表相当随意,按照需要的样式在对应单元格中拖入数据列即可,如下图所示:。
20、父格设置由于数据列不在同一行上,因此不会自动形成父子关系,我们希望客户ID、订购日期等数据列能附属于订单ID而扩展,同时报表标题及数据列标题也会跟随订单ID的扩展而复制。将BB2至B6单元格,父格设为订单ID单元格。同样,C3至C6单元格,也设置父格为订单ID单元格。预览即上图效果。注:根据父子格原理,D3至E6可以不另设父格,因为他们会自动将C3至C6单元格为左父格。。
21、如下图所示,数据按照地区字段进行了分组,分组后,地区字段作为组的标题,自成一行,这样的报表我们称之为纵向分组报表。。
22、实现思路通过父子格章节,我们知道,数据列在同一行时会自动形成父子关系,若数据列都来自于同一个数据集,就会自动形成附属关系,产生分组效果。而纵向分组报表,组头单独一行,数据列不在同一行,组头与数据间就没有父格关系了,即其他数据列就不会将地区字段作为过滤条件了。因此,这样的分组报表,只要将数据字段的父格重新设置为组头字段,就会产生分组效果了。。
23、打开报表修改报表样式将销售员与销量字段剪切至下一行,此时预览可以看到,数据与组头并没有附属关系。。
24、设置父格为了使数据分组显示,选中销售员数据列单元格,设置其左父格为地区单元格。由于地区字段作为组的标题,为了凸显标题,可改变地区字段所在行的背景色,点击单元格属性表-样式,选择背景选项,设置背景色为黄色,如下图:。
25、在分组报表中往往需要对组内的数据进行数量汇总,如下图对每个地区的销售额进行汇总:。
26、打开报表设置父格的汇总在下面加上汇总一栏,对销量进行求和,并设置“小计”单元格的左父格为地区单元格:预览模板,可以看到“小计”一栏跟随父格地区的扩展而复制,即对扩展出来的每个地区都进行一次小计,图中蓝色部分。。
27、不设置父格的汇总再加上一栏汇总,不进行父格设置,“合计”单元格无父格:预览模板,可以看到“合计”一栏仍然在下面,是在上方单元格全部扩展出来后才显示,图中红色部分。。
二、报表工具FineReport的使用: 带参程序数据集1、定义参数定义一个参数,并定义数据表结构。
2、设置数据将数据放入到定义的表中,代码如下:publicvoidinit(){ //只被执行一次 if(valueList!=null){ return; } //保存得到的数据库表名 StringtableName=parameters[0].getValue().toString(); //构造SQL语句,并打印出来 Stringsql="select*from"+tableName+";"; FRContext.getLogger().info("QuerySQLofParamTableDataDemo: "+sql); //保存得到的结果集 valueList=newArrayList(); //下面开始建立数据库连接,按照刚才的SQL语句进行查询 Connectionconn=this.getConnection(); try{ Statementstmt=conn.createStatement(); ResultSetrs=stmt.executeQuery(sql); //获得记录的详细信息,然后获得总列数 ResultSetMetaDatarsmd=rs.getMetaData(); colNum=rsmd.getColumnCount(); //用对象保存数据 Object[]objArray=null; while(rs.next()){ objArray=newObject[colNum]; for(inti=0;i 3、完整的数据集代码完整的带参程序数据集的代码如下packagecom.fr.data;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.Statement;importjava.util.ArrayList;importcom.fr.base.Env;importcom.fr.base.FRContext;importcom.fr.data.AbstractTableData;importcom.fr.base.Parameter;publicclassParamTableDataDemoextendsAbstractTableData{ //列名数组,保存程序数据集所有列名 privateString[]columnNames=null; //定义程序数据集的列数量 privateintcolumnNum= //保存查询表的实际列数量 privateintcolNum=0; //保存查询得到列值 privateArrayListvalueList=null; //构造函数,定义表结构,该表有10个数据列,列名为column#0,column#。。。。。。column#9 publicParamTableDataDemo(){ //定义tableName参数 setDefaultParameters(newParameter[]{newParameter("tableName")}); //定义程序数据集列名 columnNames=newString[columnNum]; for(inti=0;i=colNum){ returnnull; } return((Object[])valueList.get(rowIndex))[columnIndex]; } //准备数据 publicvoidinit(){ //只被执行一次 if(valueList!=null){ return; } //保存得到的数据库表名 StringtableName=parameters[0].getValue().toString(); //构造SQL语句,并打印出来 Stringsql="select*from"+tableName+";"; FRContext.getLogger().info("QuerySQLofParamTableDataDemo: "+sql); //保存得到的结果集 valueList=newArrayList(); //下面开始建立数据库连接,按照刚才的SQL语句进行查询 Connectionconn=this.getConnection(); try{ Statementstmt=conn.createStatement(); ResultSetrs=stmt.executeQuery(sql); //获得记录的详细信息,然后获得总列数 ResultSetMetaDatarsmd=rs.getMetaData(); colNum=rsmd.getColumnCount(); //用对象保存数据 Object[]objArray=null; while(rs.next()){ objArray=newObject[colNum]; for(inti=0;i 4、编译ParamTableDataDemo.java,将生成的ParamTableDataDemo.class类文件拷贝到报表工程/WEB-INF/classes目录下。由于该类是在com.fr.data包中的,因此终应该将该类放在/WEB-INF/classes/com/fr/data下面。此时该程序数据源便定义好了。 5、配置程序数据集新建报表,在报表数据集中新建程序数据源,选择我们定义好的程序数据集,如下图,名字可以自定义,如divtable。 6、使用程序数据集配置好程序数据源后便可以使用定义的程序数据集了,选中该数据集点击预览按钮,即可以输入表名动态地获取相应的数据表,并制作模板,如下图。 7、可以看到,我们已经将STSCORE表中的数据提取至程序数据集表中,像其他类型的数据集一样,可以通过拖拽方法实现单元格数据列绑定。。 1、web应用的目录结构报表部署分为两种,一是报表作为一个独立的应用独立部署;另一个是集成到现有应用即嵌入式部署。不管哪种部署方式,他们的目录结构都是类似的。如下图我们对未包含报表的应用及包含报表的应用目录作一个比较:。 2、独立部署FineReport安装目录下的WebReport目录就是一个标准的应用,因此,若用户希望将报表作为一个独立的应用进行部署的话,可以直接使用WebReport目录进行独立部署。。 3、嵌入式部署若用户希望将报表集成到自己的应用中的话,则可以对应上图“部署报表后的应用”目录结构,将对应的报表文件拷贝到相应目录即可。。 4、发布应用应用通常以文件夹或war包得形式发布,Web应用服务器不同,发布方式不同:如Tomcat服务器只需要将Web应用拷贝到%FR_HOME%webapps目录下,重启tomcat即发布成功;而Websphere服务器需要先将Web应用打成war包,然后在websphere控制台进行配置发布。各个服务器下部署报表应用我们会在下面章节中详细介绍。。 5、独立部署(发布)部署就是将FineReport应用集成到新的Web工程把FineReport_1安装目录下的WebReport文件拷贝到%Tomcat_HOME%/webapps/下:应用名WebReport可以根据需要改变,如可以改为“FineReport”。。 6、访问报表报表应用发布(部署)成功后,便可以在客户端浏览器中访问了。在客户端浏览器中输入访问地址http://ip:端口/appName/ReportServer?reportlet=GettingStarted.cpt,发送请求给Web应用服务器如tomcat;Web应用服务器会将请求信息发送给报表servlet;报表servlet根据请求信息,如获取希望查看的模板名称reportlet=GettingStarted.cpt,在后台计算生成GettingStarted.cpt的内容,返回给Web应用服务器;后Web应用服务器将结果返回给客户端浏览器,浏览器将报表结果呈现给我们。注:若Web应用服务器可以在外网进行访问,那么我们就可以外网访问报表了。。 7、描述由报表应用目录结构章节可知,若希望将报表部署到已有的工程中时,需要按照下图所示的目录结构,将报表相关的文件拷贝到相应目录:。 8、复制目录全部复制为了简便,可以直接将%FineReport_HOME%WebReportWEB-INF目录下面的classes,lib,reportlets,resources四个目录复制到%Tomcat_HOME%webappsjsp-examplesWEB-INF下。注意:%FineReport_HOME%WebReportWEB-INFclasses文件夹下面可能会放置一些网络报表的class文件,在和您的工程集成时并无冲突。。 9、部分复制也可以选择性的只复制必要性文件至已有工程中。必须复制的文件fr-server-jar:包含了报表服务的所有功能,必须拷贝至WEB-INFlib下;fr-third-jar:包含了报表服务引用的第三方插件,必须拷贝至WEB-INFlib下;reportlets:该文件夹为FineReport服务器规定的,不能修改,且必须为小写,其下可以建立子目录,所有报表模板cpt文件必须保存在reportlets文件夹下,且reportlets文件必须放在WEB-INF下;resources:该文件夹也是FineReport服务器规定的,不能修改,且必须为小写,下面包含了报表服务器的配置信息,拷贝至WEB-INF下面。以上文件或文件夹是必须拷贝到已有应用目录下的。选择性复制的文件classes:该文件夹是应用服务器规定的,主要作用是存放.class文件。若对FineReport进行了二次开发,如自定义函数、程序数据源、程序网络报表等,也需要将编译后的class类文件拷贝到该文件夹下;数据库驱动包:若报表中使用了JDBC连接了数据库,需要将对应的数据库驱动包如Oracle数据库的驱动ojdbcjar拷贝到WEB-INFlib下,其他数据库驱动同样;。 10、 修改web.xml文件在已有工程的web.xml中添加相应的servlet与servlet-mapping子元素。将%FineReport_HOME%/WebReport/WEB-INF下的web.xml中如下的部分复制到%Web_home%/webapps/Web工程名/WEB-INF下的web.xml中,在后一个servlet之后插入:ReportServercom.fr.web.ReportServlet0ReportServer/ReportServer。 11、如上代码复制放到如下目录下面的配置文件里面结果如下:注:web.xml中对于元素出现的顺序敏感。servlet必须出现在servlet-mapping标志之前。所有将所有servlet集合放置在servlet-mapping之前以便于管理与程序调用。。 12、检测是否部署成功可以通过浏览报表确定是否部署成功重新启动Tomcat,启动浏览器,在地址栏输入http:/ip:服务器端口号/项目所在目录/ReportServer,能成功进入下图所示页面,则表明FineReport应用集成web应用并部署Tomcat服务器成功:。 1、第一步,双击打开FineReport报表工具,新建普通报表,并插入一个数据集字段id,如下图所示:。 2、第二步,选中该字段的单元格,找到超级链接,添加链接选择网络报表,如下图所示:。 3、第三步,打开网络报表设置界面,选择目标报表,链接打开方式和参数传递方式,如下图所示:。 4、第四步,保存第三步设置,然后修改超级链接名称为下钻跳转,字段id添加描述,如下图所示:。 5、第五步,保存文件并在浏览器中预览该设计效果,可以看到ID字段列下方有下划线,如下图所示:。 6、第六步,再设计目标报表,设计一个饼图并保存;点击父表中的id属性,查看是否发生跳转,如下图所示:。 1、模板准备由于需要使用离线填报,故我们先将该模板的数据连接更换成远程服务器的,如下图:。 2、接下来将Mutifill模板的报表填报属性的数据库修改成新建数据连接里面对应的数据表,即使数据填报至远程数据库中,如下图:注:离线填报是指在离线环境下将数据录入进来,然后填报至远程数据库中,所以我们需要准备一个远眠调程数据连接和数据填报。。 3、输出离线html报表将Mutifill.cpt输出为离线html报表,并将里面的露眠棍文件夹解压出来,如下图:。 4、断网状态下进行数据填报前面的操作都是在联网的状态下进行的,现在我们断开网络,如下图:。 5、打开Multifill文件夹,双击直接打开Multifill.html,可以在浏览器看到该html显示的样式跟联网时查看的cpt模板样式一模一样,如下图,点击所属分公司标签后面的按钮,在下拉框中将江苏分公司修改成浙江分公司,并将个人电脑的使用年限修改为5年,可以看到平均每个设备每年成本费字段数据会自动计算:注:修改过的数据左上角均会显示一个红色的三角形,点击撤销按钮可撤销上一步操作,点击清除按钮删除该张html上面的所有修改。另:由于离线html报表录入的数据会自动保存在浏览器自带的数据库中,浏览器数据保存是根据html名称保存,故如果两个html名字一样,就算路径不一样,在同一个浏览器中打开,都距沃会显示成第一个打开的html报表的结果。并且,如果想删除离线html上面的所有修改,直接关掉该html是不起作用的,必须将浏览器中的数据删掉,可以直接点击html工具栏上的清除按钮。。 6、数据校验数据填好之后,点击工具栏上的数据校验按钮,可以对数据进行校验,将不符合数据校验规则的数据修改好直至通过数据校验。。 7、联网提交现在数据已经全部录入好了,下面就应该将离线html中采集的数据进行提交,回到联网状态,点击html页面的提交按钮即可。如果还是在断网的情况下点击提交按钮,FineReport会提示如下图所示对话框:。 1、准备数据集数据库的数据表是项目ID与项目名称有一张单独的表来保存,另有项目数量,财政补贴资金,单位自筹资金,其它资金等四张列表。每张表均通过ID字段与项目名称表建立关系,以下是五张内置的数据集:注:在数据集面板中点击添加按钮,选择内置数据集即可新建内置数据集,直接添加数据,详细请查看内置数据集项目名称(项目名称,ID)--project。 2、项目总数(ID,项目总数)--zs。 3、财政拨款(ID,金额)--cz。 4、单位自筹(ID,金额)--dz。 5、其它资金(ID,金额)--qt。 6、表样设计如下设计报表:。 7、绑定数据列及过滤设置将数据列依次拖拽到单元格中,设置如下:。 8、编号和公式在需要添加编号和计算汇总的格子中写入公式:。 9、保存并预览报表保存模板。设计器中点击分页预览,即如上的效果图。。 1、双击打开FineReport报表设计器,点击左下角数据库查询。 2、打开数据库查询窗口,单击如图所示的图标。 3、再打开一个定义数据连接窗口,数据库选择MySQL,然后选择驱动;填写URL、用户名、密码,点击测试连接。 4、耐心等待一段时间,弹出连接失败的窗口。 5、打开MySQL数据库客户端,使用同样的主机、用户名和密码连接,提示连接成功。 6、进入到FineReport安装目录,查找到WEB-INF文件夹下的lib,删掉mysql-connector-java-39-bin.jar。 7、下载mysql-connector-java-jar文件,先关闭报表设计器,拷贝到上述步骤的同目录下。 8、重启FineReport报表设计器,尝试连接MySQL数据库,结果发现连接成功。 1、设置日志输出级别修改日志输出级别为“显示普通信息”,如下图设计器中设置:。 2、查看报表执行过程1 打开模板打开FR设计器,打开里面自带的模板:%FR_HOME%WebReportWEB-INF eportletsgettingstarted.cpt2 清空日志点击分页预览前,先清空日志。。 3、浏览器端访问报表点击分页预览,输入参数条件后,点击查询;等到报表在浏览器上完全展示出来后,查看日志窗口的信息:从日志中我们可以对报表的执行过程进行实时监控。。 1、第一步,打开FineReport报表设计器,新建一个空白的决策报表,如下图所示:。 2、第二步,在决策报表中,插入一个报表块组件,用于设计表格并加载,如下图所示:。 3、第三步,接着使用图形块,在表格上方添加一个饼图模块,自动加载位置,如下图所示:。 4、第四步,新建数据库查询的内置数据集,添加三个字段并插入数据,如下图所示:。 5、第五步,依次拖动数据集中的字段到表格单元格中,并添加表格表头,如下图所示:。 6、第六步,再次添加一个饼图,分别使用数据集中的math和english字段绑定,如下图所示:。