乐趣区

关于后端:jaspersoft-父报表向子报表传值循环

jsaper 子报表 Subreport(父子报表相互传值) 有很多人都说 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.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 文件

 

退出移动版