Jasperreports+jaspersoft studio学习教程(九)- 报表分页和大量数据内存处理

9.1 设计报表模板

9.1.1 使用Table组件新建模板(步骤参考教程七)如下:




9.1.2 模板自带变量




$V{PAGE_NUMBER} :代表当前页数(可以是页码也可以是页数,通过TextField的计算时间的不同值来设置)

$V{PAGE_COUNT} :当前页面中记录的数目

$V{groupname_COUNT} :   代表当前组的记录数

$V{COLUMN_NUMBER} :列号码

$V{COLUMN_COUNT} :当前列中记录的数目(是当前页里行的序号,在新页上会重置为1)

$V{REPORT_COUNT} :当前文档中数据源记录数目。

 

这里主要使用 $V{PAGE_NUMBER} 来做报表分页

 

 

对于$V{PAGE_NUMBER}:当evaluationTime="Now"时,即是计算当页所在哪一页。 (now:即时执行此表达式)

当evaluationTime="Report"时,计算最后一页,即总页数。(Report:整个报表执行完后才执行此表达式)


9.1.3 拖动6个Text Field组件到Page Footer Band中




设置 第几页 ,注意 其 Evaluation Time 选中 Now。






设置 共几页 ,注意 其 Evaluation Time 选中 Report。





9.1.4 设置 首页、上一页、下一页、末页 需要使用超链接

 

新建一个模板,把 首页 拷贝过去(这里使用DemoReport1.jrxml)

点击首页显示Properties ,搜索HyperLink PageException




设置 链接 为 “https://www.baidu.com/”



保存后,以 HTML 方式 Preview 后,点击首页跳转到百度。





9.1.5 设置 首页、上一页、下一页、末页

 

在 Hyperlink PageExpression 框中输入时需要注意,我们需要设定变量才能正确的导向是哪一页

以下是各选择在HyperlinkPage Expression框中输入的信息

 

首页   : "/JasperWeb/JasperServlet9?page=0"

上一页 :  "/JasperWeb/JasperServlet9?page="+($V{PAGE_NUMBER}-Long.valueOf("1"))

下一页 :  "/JasperWeb/JasperServlet9?page="+($V{PAGE_NUMBER}+Long.valueOf("1"))

末页   : "/JasperWeb/JasperServlet9?page=lastPage"

 

保存模板文件后拷贝到JasperWeb项目中


9.2 编写java代码,实现分页逻辑及大量数据内存处理


  
  
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. Map<String,Object> parameters = new HashMap<String,Object>( 16);
  3. String pageStr = request.getParameter( "page");
  4. HttpSession session = request.getSession();
  5. int pageIndex = 0;
  6. int lastPageIndex = 0;
  7. //list数据源
  8. List<Users> list = new ArrayList<Users>();
  9. for( int i = 1 ; i <= 50 ; i++) {
  10. Users users = new Users(i, "name"+i, "grade"+i, "college"+i, "mobile"+i);
  11. list. add(users);
  12. }
  13. ModelTableSource mts = new ModelTableSource();
  14. mts.setDate( new SimpleDateFormat( "yyyy-MM-dd").format( new Date()));
  15. mts.setTableData( new JRBeanCollectionDataSource(list));
  16. List<ModelTableSource> mlist = new ArrayList<ModelTableSource>();
  17. mlist. add(mts);
  18. String jrxmlPath = request.getServletContext().getRealPath( "/")+ "/jrxml/DemoReport9.jrxml";
  19. //由jrxml文件编译后生产jasper文件的路径
  20. String jasperPath = request.getServletContext().getRealPath( "/")+ "/jasper/DemoReport9.jasper";
  21. PrintWriter out = null;
  22. try {
  23. //编译jrxml生产jasper文件
  24. JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);
  25. //JasperPrint将数据全部取出,放到session中
  26. JasperPrint jasperPrint = (JasperPrint) session.getAttribute( "jasperPrint");
  27. if( null == jasperPrint) {
  28. jasperPrint = this.getJasperPrint(jasperPath, parameters, mlist);
  29. session.setAttribute( "jasperPrint", jasperPrint);
  30. }
  31. if( null != jasperPrint.getPages()) {
  32. lastPageIndex = jasperPrint.getPages().size() - 1;
  33. }
  34. if( null == pageStr) {
  35. pageStr = "0";
  36. }
  37. try {
  38. pageIndex = Integer.valueOf(pageStr);
  39. if(pageIndex > 0) {
  40. pageIndex = pageIndex -1 ;
  41. }
  42. } catch (Exception e) {
  43. // 如果得到的非数字字符串
  44. if( "lastPage". equals(pageStr)) {
  45. pageIndex = lastPageIndex;
  46. }
  47. }
  48. if (pageIndex < 0) {
  49. pageIndex = 0;
  50. }
  51. if (pageIndex > lastPageIndex) {
  52. pageIndex = lastPageIndex;
  53. }
  54. //将html输出到浏览器上
  55. JRHtmlExporter exporter = new JRHtmlExporter();
  56. response.setCharacterEncoding( "UTF-8");
  57. out = response.getWriter();
  58. //分页
  59. exporter.setParameter(JRExporterParameter.PAGE_INDEX, pageIndex);
  60. exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
  61. exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
  62. exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
  63. exporter.exportReport();
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. } finally {
  67. out.flush();
  68. out.close();
  69. }
  70. }
  71. private JasperPrint getJasperPrint(String jasperPath, Map<String, Object> parameters, List<?> list) throws JRException {
  72. //解决大数据量保留在内存中,只在内存中保留两页,剩下的放入磁盘中
  73. JRFileVirtualizer virtualizer = new JRFileVirtualizer( 2, "D:/data");
  74. parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
  75. virtualizer.setReadOnly( true);
  76. return JasperFillManager.fillReport(jasperPath, parameters, new JRBeanCollectionDataSource(list));
  77. }



访问servlet,如下:




将第三页存储在磁盘中。



教程就先写到这,以后有知识点再加添补。本教程Demo源码提供,JasperWeb源码

 


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值