有很多人都说Jasperreports不适合中国式复杂报表,实际上运用好父子报表可以解决大部分问题了。例如下面的表。每个学生的学科数目不固定,且每个学生后有相当于小计的平均分。有点复杂度的报表,可以使用子报表解决。

1.1 设计报表模板

1.1.1 新建主模板DemoReport6_main.jrxml,创建Paramters :title(java.lang.String)、date(java.lang.String)、SUBREPORT_DIR(java.lang.String),创建Fields :stuNo(java.lang.Integer)、

stuName(java.lang.String)、subjectList(java.util.List)

1.1.2 设计模板表头如下,注意宽度:

1.1.3 新建子模板DemoReport6_sub.jrxml,只保留DetailBand(Height设置为20),并设置模板的宽500,高20,且四周Margin都为0

1.1.4 转到DemoReport6_main主模板,将Subreport组件拖入到Detail中,跳出Subreport界面

1.1.5 将stuNo和stuName拖入到Detail中

1.1.6 转到DemoReport6_sub子模板,新建Fields:subjectName(String)、teacherName(String)、score(java.lang.Double).拖入到Detail中,注意宽度和主模板保持一致

1.1.7 新建Variables,命名为averageScore

1.1.8 转回DemoReport6_mian主模块,新建Variables,命名为getAverageScore

拖入到Detail Band中,设置好字体样式

点击 $V{getAverageScore} 显示Properties,设置Appearance中Position Type选中为Fix Relation To Bottom(同样将“平均分”如此设置)

设置TextField的Evaluation Time 选中为Band

1.1.9 将Subreport、$F{stuNo}、$F{stuName}放进一个Element Group里,直接在source中添加(未找到图形化操作)

<detail>

...

<elementGroup>

<subreport>

...

</subreport>

<textField>

... <textFieldExpression><![CDATA[$F{stuNo}]]></textFieldExpression>

</textField>

<textField>

...

<textFieldExpression><![CDATA[$F{stuName}]]></textFieldExpression>

</textField>

</elementGroup>

...

</detail>

保存后:

1.1.10 点击 $F{stuNo} 显示Properties,设置Position Type 为Float,Stretch Type为 ElementGroupHeight,把stuNo和Subreport也如此设置。

1.1.11 点击Subreport 显示Properties,在Subreport中设置Exception为$P{SUBREPORT_DIR}+"DemoReport6_sub.jasper",Data Source Expression为

newnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{subjectList})

点击 Edit Return Values

保存主模板,子模板,放到项目中的jrxml中。

1.2 编写Servlet注入数据源

1.2.1 新建 Student类和Subject类

package com.jasper.bean;

import java.util.ArrayList;
import java.util.List;

public class Student {

//注意和模板中数据类型保持一致
private Integer stuNo;

private String stuName;

private List<Subject> subjectList = new ArrayList<Subject>();

// get、set方法省略

}
package com.jasper.bean;

public class Subject {

private String subjectName;

private String teacherName;

private Double score;

// get、set方法省略

}

1.2.2 新建JasperServlet6,doGet内容如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Map<String,Object> parameters = new HashMap<String,Object>(16);

//组装list数据源
Subject sub1 = new Subject("语文","张老师",80.0);
Subject sub2 = new Subject("数学","王老师",90.0);
Subject sub3 = new Subject("物理","孙老师",46.0);
Subject sub4 = new Subject("政治","李老师",50.0);
List<Student> list = new ArrayList<Student>();

Student stu1 = new Student();
stu1.setStuNo(101);
stu1.setStuName("小明");
List<Subject> sublist1 = new ArrayList<Subject>();
sublist1.add(sub1);
sublist1.add(sub2);
stu1.setSubjectList(sublist1);

Student stu2 = new Student();
stu2.setStuNo(102);
stu2.setStuName("小雨");
List<Subject> sublist2 = new ArrayList<Subject>();
sublist2.add(sub2);
sublist2.add(sub3);
sublist2.add(sub4);
stu2.setSubjectList(sublist2);

Student stu3 = new Student();
stu3.setStuNo(103);
stu3.setStuName("小东");
List<Subject> sublist3 = new ArrayList<Subject>();
sublist3.add(sub4);
sublist3.add(sub3);
stu3.setSubjectList(sublist3);

list.add(stu1);
list.add(stu2);
list.add(stu3);

String mainjrxmlPath = request.getServletContext().getRealPath("/")+"/jrxml/DemoReport6_main.jrxml";
String subjrxmlPath = request.getServletContext().getRealPath("/")+"/jrxml/DemoReport6_sub.jrxml";
//由jrxml文件编译后生产jasper文件的路径
String mainjasperPath = request.getServletContext().getRealPath("/")+"/jasper/DemoReport6_main.jasper";
String subjasperPath = request.getServletContext().getRealPath("/")+"/jasper/DemoReport6_sub.jasper";

try {
//编译jrxml生产jasper文件
JasperCompileManager.compileReportToFile(mainjrxmlPath, mainjasperPath);
JasperCompileManager.compileReportToFile(subjrxmlPath, subjasperPath);

parameters.put("title", "学生成绩表");
parameters.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
String SUBREPORT_DIR = request.getServletContext().getRealPath("/")+"/jasper/";
parameters.put("SUBREPORT_DIR",SUBREPORT_DIR);

JasperPrint jasperPrint = JasperFillManager.fillReport(mainjasperPath, parameters, new JRBeanCollectionDataSource(list));
//生成html文件(位置:D:/HTML/student.html)
JasperExportManager.exportReportToHtmlFile(jasperPrint, "D:/HTML/student.html");
} catch (JRException e) {
e.printStackTrace();
}
}

1.3 启动tomcat,访问servlet,查看html文件

————————————————
版权声明:本文为CSDN博主「ZeWe」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SHIYUN123zw/article/details/79221708

jsaper子报表Subreport(父子报表互相传值)的更多相关文章

  1. vue+elementUI项目,父组件向子组件传值,子组件向父组件传值,父子组件互相传值。

    vue+elementUI项目,父组件向子组件传值,子组件向父组件传值,父子组件互相传值. vue 父组件与子组件相互通信 一.父组件给子组件传值 props 实现父组件向子组件传值. 1父组件里: ...

  2. Vue父子,子父,非父子组件之间传值

    Vue组件基础 纯属随笔记录,具体详细教程,请查阅vue.js网站 子组件给父组件传值: <body> <div id="app"> <my-app& ...

  3. Dynamic CRM 2013学习笔记(十五)报表设计:报表入门、开发工具及注意事项

    本文是关于CRM 2013报表开发入门介绍,包括开发工具的使用,以及不同于普通Reporting service的相关注意事项. 一.CRM报表简介 报表有两种,SQL-based报表和Fetch-b ...

  4. ActiveReports 报表控件官方中文入门教程 (3)-如何选择页面报表和区域报表

    本篇文章将介绍区域报表和页面报表的常见使用场景.区别和选择报表类型的一些建议,两种报表的模板设计.数据源(设计时和运行时)设置.和浏览报表的区别. ActiveReports 报表控件官方中文入门教程 ...

  5. 在VS2012后的版本中做数据报表时,提示尚未指定报表“Report1”的报表定义

    有一群的朋友在用VS2012做数据报表时,老是提示 本地报表处理期间出错. 尚未指定报表“Report1”的报表定义 未将对象引用设置到对象的实例. 我看了一下,步骤没错,我用VS2010做了一下,一 ...

  6. vue父子组件之间传值

    vue父子组件进行传值 vue中的父子组件,什么是父组件什么是子组件呢?就跟html标签一样,谁包裹着谁谁就是父组件,被包裹的元素就是子组件. 父组件向子组件传值 下面用的script引入的方式,那种 ...

  7. vue父子组件的传值总结

    久违的博客园我又回来了.此篇文章写得是vue父子组件的传值,虽然网上已经有很多了.写此文章的目的就是记录下个人学习的一部分.接下来我们就进入主题吧! 在开发vue项目中,父子组件的传值是避免不掉的. ...

  8. 使用FastReport报表工具生成报表PDF文档

    在我们开发某个系统的时候,客户总会提出一些特定的报表需求,固定的报表格式符合他们的业务处理需要,也贴合他们的工作场景,因此我们尽可能做出符合他们实际需要的报表,这样我们的系统会得到更好的认同感.本篇随 ...

  9. Vue父子组件相互传值及调用方法的方案

    Vue父子组件相互传值及调用方法的方案 一.调用方法: 1.父组件调用子组件方法: 2.子组件调用父组件方法: 参考:https://www.cnblogs.com/jin-zhe/p/9523782 ...

随机推荐

  1. VS编译程序添加图标

    如图 然后编译就就生成有图标的了.

  2. java中将从数据库查询的信息输出到excel文件中

    package com.cn.peitest.excel; import java.io.File; import java.lang.reflect.Field; import java.util. ...

  3. git使用下

    Git 内部工作原理 Git 本质上是一个内容寻址文件系统,最初是一套面向版本控制系统的工具集,而不是一个完整的用户友好的版本控制系统.因此它还包含了一些用于完成底层工作的命令,这些命令被称为&quo ...

  4. Qt学习笔记-Qt-4.8.6+phonon+mplayer

    首先,用phonon播放音乐时,可以使用mplayer.首先,你的设备上需要安装一个mplayer并测试能用. 然后安装后端播放插件. 我用的是网上找的phonon-mplayer. 按照网上的方法, ...

  5. 在搜索引擎中输入汉字就可以解析到对应的域名,请问如何用LoadRunner进行测试。

    建立测试计划,确定测试标准和测试范围 设计典型场景的测试用例,覆盖常用业务流程和不常用的业务流程等 根据测试用例,开发自动测试脚本和场景: 录制测试脚本:新建一个脚本(Web/HTML协议):点 ...

  6. [剑指 Offer 11. 旋转数组的最小数字]

    [剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5, ...

  7. Date、SimpleDateFormat以及Calendar

    Date类 毫秒值 java.util.Date:表示日期和时间的类 类Date表示特定的瞬间,精确到毫秒 日期转毫秒,号秒转日期 中国属于东八区,会把事件增加8个小时 1天 = 4 * 60 * 6 ...

  8. 安装Android Studio遇到的问题

    1. 学习视频 视频链接:https://www.bilibili.com/video/BV1jW411375J?p=2 2. Android Studio1.5.1的下载地址: http://www ...

  9. OpenOCD安装与使用(JTAG调试)

    本文介绍openocd开源软件的安装以及搭配JTAG对Xilinx u500VC707devkit的调试 PC OS: Ubuntu20.04 LTS Target ARCH: riscv64 JTA ...

  10. 为什么 TCP 连接的建立需要三次握手

    TCP 的通讯双方需要发送 3 个包(即:三次握手)才能建立连接,本文将通过 3 副图来解释为什么需要 3 次握手才能建立连接. TCP 连接的建立过程本质是通信双方确认自己和对方都具有通信能力的过程 ...