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

本文主要是介绍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代码,实现分页逻辑及大量数据内存处理

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Map<String,Object> parameters = new HashMap<String,Object>(16);String pageStr = request.getParameter("page");HttpSession session = request.getSession();int pageIndex = 0;int lastPageIndex = 0;//list数据源List<Users> list = new ArrayList<Users>();for(int i = 1 ; i <= 50 ; i++) {Users users = new Users(i,"name"+i,"grade"+i,"college"+i,"mobile"+i);list.add(users);}ModelTableSource mts = new ModelTableSource();mts.setDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));mts.setTableData(new JRBeanCollectionDataSource(list));List<ModelTableSource> mlist = new ArrayList<ModelTableSource>();mlist.add(mts);String jrxmlPath = request.getServletContext().getRealPath("/")+"/jrxml/DemoReport9.jrxml";//由jrxml文件编译后生产jasper文件的路径String jasperPath = request.getServletContext().getRealPath("/")+"/jasper/DemoReport9.jasper";PrintWriter out = null;try {//编译jrxml生产jasper文件JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);//JasperPrint将数据全部取出,放到session中JasperPrint jasperPrint = (JasperPrint) session.getAttribute("jasperPrint");if(null == jasperPrint) {jasperPrint = this.getJasperPrint(jasperPath, parameters, mlist);session.setAttribute("jasperPrint", jasperPrint);}if(null != jasperPrint.getPages()) {lastPageIndex = jasperPrint.getPages().size() - 1;}if(null == pageStr) {pageStr = "0";}try {pageIndex = Integer.valueOf(pageStr);if(pageIndex > 0) {pageIndex = pageIndex -1 ;}} catch (Exception e) {// 如果得到的非数字字符串if("lastPage".equals(pageStr)) {pageIndex = lastPageIndex;}}if (pageIndex < 0) {pageIndex = 0;}if (pageIndex > lastPageIndex) {pageIndex = lastPageIndex;}//将html输出到浏览器上JRHtmlExporter exporter = new JRHtmlExporter();response.setCharacterEncoding("UTF-8");out = response.getWriter();//分页exporter.setParameter(JRExporterParameter.PAGE_INDEX, pageIndex);exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);exporter.exportReport();} catch (Exception e) {e.printStackTrace();}finally {out.flush();out.close();}}private JasperPrint getJasperPrint(String jasperPath, Map<String, Object> parameters, List<?> list) throws JRException {//解决大数据量保留在内存中,只在内存中保留两页,剩下的放入磁盘中JRFileVirtualizer virtualizer = new JRFileVirtualizer(2, "D:/data");parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);virtualizer.setReadOnly(true);return JasperFillManager.fillReport(jasperPath, parameters, new JRBeanCollectionDataSource(list));	 }



访问servlet,如下:




将第三页存储在磁盘中。



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

 


这篇关于Jasperreports+jaspersoft studio学习教程(九)- 报表分页和大量数据内存处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465024

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处