Jasperreports+jaspersoft studio学习教程(八)- 子报表Subreport(父子报表互相传值)

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




8.1 设计报表模板

8.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)




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



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




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





8.1.5 将stuNo和stuName拖入到Detail中




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




8.1.7 新建Variables,命名为averageScore





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




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




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




设置TextField的Evaluation Time 选中为Band




8.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>

保存后:



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




8.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中。


8.2 编写Servlet注入数据源

 

8.2.1 新建 Student类和Subject类



  
  
  1. package com.jasper.bean;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class Student {
  5. //注意和模板中数据类型保持一致
  6. private Integer stuNo;
  7. private String stuName;
  8. private List <Subject> subjectList = new ArrayList <Subject>();
  9. // get、set方法省略
  10. }

 
 
  1. package com.jasper.bean;
  2. public class Subject {
  3. private String subjectName;
  4. private String teacherName;
  5. private Double score;
  6. // get、set方法省略
  7. }


8.2.2 新建JasperServlet6,doGet内容如下:



 
 
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. Map<String,Object> parameters = new HashMap<String,Object>( 16);
  3. //组装list数据源
  4. Subject sub1 = new Subject( "语文", "张老师", 80.0);
  5. Subject sub2 = new Subject( "数学", "王老师", 90.0);
  6. Subject sub3 = new Subject( "物理", "孙老师", 46.0);
  7. Subject sub4 = new Subject( "政治", "李老师", 50.0);
  8. List<Student> list = new ArrayList<Student>();
  9. Student stu1 = new Student();
  10. stu1.setStuNo( 101);
  11. stu1.setStuName( "小明");
  12. List<Subject> sublist1 = new ArrayList<Subject>();
  13. sublist1. add(sub1);
  14. sublist1. add(sub2);
  15. stu1.setSubjectList(sublist1);
  16. Student stu2 = new Student();
  17. stu2.setStuNo( 102);
  18. stu2.setStuName( "小雨");
  19. List<Subject> sublist2 = new ArrayList<Subject>();
  20. sublist2. add(sub2);
  21. sublist2. add(sub3);
  22. sublist2. add(sub4);
  23. stu2.setSubjectList(sublist2);
  24. Student stu3 = new Student();
  25. stu3.setStuNo( 103);
  26. stu3.setStuName( "小东");
  27. List<Subject> sublist3 = new ArrayList<Subject>();
  28. sublist3. add(sub4);
  29. sublist3. add(sub3);
  30. stu3.setSubjectList(sublist3);
  31. list. add(stu1);
  32. list. add(stu2);
  33. list. add(stu3);
  34. String mainjrxmlPath = request.getServletContext().getRealPath( "/")+ "/jrxml/DemoReport6_main.jrxml";
  35. String subjrxmlPath = request.getServletContext().getRealPath( "/")+ "/jrxml/DemoReport6_sub.jrxml";
  36. //由jrxml文件编译后生产jasper文件的路径
  37. String mainjasperPath = request.getServletContext().getRealPath( "/")+ "/jasper/DemoReport6_main.jasper";
  38. String subjasperPath = request.getServletContext().getRealPath( "/")+ "/jasper/DemoReport6_sub.jasper";
  39. try {
  40. //编译jrxml生产jasper文件
  41. JasperCompileManager.compileReportToFile(mainjrxmlPath, mainjasperPath);
  42. JasperCompileManager.compileReportToFile(subjrxmlPath, subjasperPath);
  43. parameters.put( "title", "学生成绩表");
  44. parameters.put( "date", new SimpleDateFormat( "yyyy-MM-dd").format( new Date()));
  45. String SUBREPORT_DIR = request.getServletContext().getRealPath( "/")+ "/jasper/";
  46. parameters.put( "SUBREPORT_DIR",SUBREPORT_DIR);
  47. JasperPrint jasperPrint = JasperFillManager.fillReport(mainjasperPath, parameters, new JRBeanCollectionDataSource(list));
  48. //生成html文件(位置:D:/HTML/student.html)
  49. JasperExportManager.exportReportToHtmlFile(jasperPrint, "D:/HTML/student.html");
  50. } catch (JRException e) {
  51. e.printStackTrace();
  52. }
  53. }


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











评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值