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

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映