9.1 设计报表模板

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

 

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

 

 

9.1.2 模板自带变量

 

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

 

 

$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中

 

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

 

 

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

 

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

 

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

 

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

 

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

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

 

 

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

 

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

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

 

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

 

 

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

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

 

 

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

 

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

 

 

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.  
  8. //list数据源

  9. List<Users> list = new ArrayList<Users>();

  10. for(int i = 1 ; i <= 50 ; i++) {

  11. Users users = new Users(i,"name"+i,"grade"+i,"college"+i,"mobile"+i);

  12. list.add(users);

  13. }

  14. ModelTableSource mts = new ModelTableSource();

  15. mts.setDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));

  16. mts.setTableData(new JRBeanCollectionDataSource(list));

  17. List<ModelTableSource> mlist = new ArrayList<ModelTableSource>();

  18. mlist.add(mts);

  19.  
  20. String jrxmlPath = request.getServletContext().getRealPath("/")+"/jrxml/DemoReport9.jrxml";

  21. //由jrxml文件编译后生产jasper文件的路径

  22. String jasperPath = request.getServletContext().getRealPath("/")+"/jasper/DemoReport9.jasper";

  23. PrintWriter out = null;

  24. try {

  25.  
  26. //编译jrxml生产jasper文件

  27. JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);

  28.  
  29. //JasperPrint将数据全部取出,放到session中

  30. JasperPrint jasperPrint = (JasperPrint) session.getAttribute("jasperPrint");

  31. if(null == jasperPrint) {

  32. jasperPrint = this.getJasperPrint(jasperPath, parameters, mlist);

  33. session.setAttribute("jasperPrint", jasperPrint);

  34. }

  35.  
  36.  
  37. if(null != jasperPrint.getPages()) {

  38. lastPageIndex = jasperPrint.getPages().size() - 1;

  39. }

  40. if(null == pageStr) {

  41. pageStr = "0";

  42. }

  43. try {

  44. pageIndex = Integer.valueOf(pageStr);

  45. if(pageIndex > 0) {

  46. pageIndex = pageIndex -1 ;

  47. }

  48. } catch (Exception e) {

  49. // 如果得到的非数字字符串

  50. if("lastPage".equals(pageStr)) {

  51. pageIndex = lastPageIndex;

  52. }

  53. }

  54.  
  55. if (pageIndex < 0) {

  56. pageIndex = 0;

  57. }

  58. if (pageIndex > lastPageIndex) {

  59. pageIndex = lastPageIndex;

  60. }

  61.  
  62. //将html输出到浏览器上

  63. JRHtmlExporter exporter = new JRHtmlExporter();

  64. response.setCharacterEncoding("UTF-8");

  65. out = response.getWriter();

  66. //分页

  67. exporter.setParameter(JRExporterParameter.PAGE_INDEX, pageIndex);

  68. exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

  69. exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);

  70. exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);

  71. exporter.exportReport();

  72.  
  73. } catch (Exception e) {

  74. e.printStackTrace();

  75. }finally {

  76. out.flush();

  77. out.close();

  78. }

  79. }

  80.  
  81.  
  82. private JasperPrint getJasperPrint(String jasperPath, Map<String, Object> parameters, List<?> list) throws JRException {

  83. //解决大数据量保留在内存中,只在内存中保留两页,剩下的放入磁盘中

  84. JRFileVirtualizer virtualizer = new JRFileVirtualizer(2, "D:/data");

  85. parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

  86. virtualizer.setReadOnly(true);

  87.  
  88. return JasperFillManager.fillReport(jasperPath, parameters, new JRBeanCollectionDataSource(list));

  89. }

  90.  
  91.  


 

 

访问servlet,如下:

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

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

 

 

将第三页存储在磁盘中。

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

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

相关文章:

  • 2021-05-11
  • 2021-10-23
  • 2021-09-06
  • 2021-04-07
  • 2021-05-29
  • 2021-06-14
  • 2022-12-23
  • 2021-08-07
猜你喜欢
  • 2021-08-25
  • 2021-10-23
  • 2021-12-04
  • 2021-08-21
  • 2021-05-01
  • 2021-05-26
  • 2021-08-28
相关资源
相似解决方案