利用JasperReport+iReport进行Web报表开发

用JasperReport+iReport进行Web报表开发

序言
在非常多实际的项目里,报表都是当中十分重要的组成部分,比如把查询结果以报表的形式呈现出来。这里所提到的报表可不是简单的二维表,而是拥有复杂表头的、多维的、能够在执行期从数据库中自己主动读取数据、可自己主动分页、拥有丰富的页面元素(图片,超连接等)、支持分组和交叉表、支持打印、最好还能导出到Excel或Word…...(汗L)。可是显而易见,报表功能越强大,提供的服务越丰富,其复杂度也就越提高,所以仅靠石器时代的手工方式生成报表是不能满足须要的。所幸,眼下我们所熟知的几款报表工具功能上足够强大,并且都附有非常方便的报表生成工具。它们各自是:JasperReport(+iReport),BIRT(+eclipse),水晶报表(+eclipse,JBuiler等等)。
之所以提到这三种报表工具首先是由于他们都是开放源代码的(CrystalReportForEclipse1.0已经开源了)。既然不用考虑费用,那在我们的项目中究竟选用哪一个呢?对于水晶报表而言,尽管其在.Net平台上表现十分抢眼,可是在Java平台上,多数的实现都是要收费的(比如For JBuilder版),并且其Eclipse插件的资源消耗十分惊人(我的机器配置为P4 3.0+512RAM,使用“Eclipse3.2+水晶报表插件”根本就跑不动)。所以我选择了纯Java的报表工具JasperReport与iReport的组合。可是关于JasperReport的文档相对匮乏,其官方文档还是要收费的,所我希望利用这篇文章展示怎样利用这一强力组合来进行基于Web的报表开发,希望能为那些苦于报表的同仁们解决一些实际问题。
本文将火力集中在怎样在Web环境下配置和使用JasperReport报表和报表的导出功能等方面,因为在曾经的Blog中我已经写过怎样设计普通的报表,所里这里将不再赘述。对于那些主要的操作则留给读者自行体会,相信在iReport的帮助下,上手会非常快的。
(注:本文已被《程序猿》收录,未经同意不得转载


1     JasperReport简单介绍
2     Web报表开发
2.1      环境设置
2.2      报表预览框架
2.3      使用JNLP技术实现client预览
3     结束语... 24


1   JasperReport简单介绍
JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,XML,Excel(通过POI或JExcelAPI实现)和Rtf(通过POI实现)格式。该库全然由Java写成,能够用于在各种Java应用程序,包含J2EE,Web应用程序中生成动态内容。它的主要目的是辅助生成面向页面的(page oriented),准备付诸打印的文档。JasperReport借由定义于XML文档中的report design进行数据组织。这些数据可能来自不同的数据源,包含关系型数据库,collections,java对象数组。通过实现简单的接口,用户就能够将report library插入到订制好的数据源中。用JasperReport进行报表开发的步骤例如以下所看到的(Version=1.0):
眼下JasperReport最新的版本号是1.2.7,能够到Sourceforg站点下载其整个project及代码。其project文件文件夹下的demo子文件夹中包括非常多定义良好的样例,能够实现各种所需功能。鉴于它的文档收费,想学习使用JasperReport的话我们也仅仅能以这些demo作为学习资料了。
可是繁琐的XML标记和功能API在提供强大的动态及可扩展开发的同一时候也带来了超高的复杂性,在没有免费文档的情况下,手工编写报表设计所需的XML文件是极其不明智的。只是正如我们用JBuilder(或其它可视化开发工具)编写SwingGUI时一样,我们能够採用iReport进行可视化的报表设计来避免和可怕的XML文件及实现细节打交道。尽管可能会损失一些动态生成报表的灵活性,可是大多数情况下,我们仅仅须要静态的设计框架和动态的装填数据而非常少须要动态的报表框架,所以和我们所获得的方便相比,这些小小的损失简直能够忽略不计了。当然假设确实须要,且看到以下的东西你不晕的话,自己动手确实能够获得所需的灵活性。
当中的VerticalFilling和HorizontalFilling表示装填数据的顺序。从上图我们能够清楚地看到,一个报表的设计主要由PageHeader和报表内容组成,报表内容又是由列组成,内容既能够是一列也能够是多列,还能够是Group。详细的实比例如以下:
这些元素究竟在JaserReport的XML设计文件里的定义为何我并不想关心,由于这都由iReport负责担心了,我们仅仅需轻松的像搭积木一样利用iReport加入各种可视化元素就能够了。相信用过之后你会对iReport爱不释手,就像我一样。出于实际须要,我会提供一个简单的动态表单的生成框架供各位參考。 
2   Web报表开发
现今的环境是Web大行其道,一个工具假设不能融入Web功能就无法立足。JasperReport的开发人员显然非常早就意识到了这一点,所以在JasperReport1.0曾经就增加了支持Servlet/JSP的能力。也就是说,我们能够利用Servlet/JSP将生成好的报表导出成HTML(或PDF/RTF/EXCEL)格式供预览或导出之用。然而唯一的缺憾在于JasperReport并未提供在client直接打印的功能,而除了使用Applet之外我们又不能直接在client显示JRViewer这种预览窗体,怎样解决这些问题呢?
2.1环境设置
在Servlet/JSP中使用JasperReport无需很多其它的设置,仅仅须要将JasperReport所用到的jar包放入project中的WEB-INF/lib文件夹下就可以。在程序执行期,Servlet/JSP仅仅需可以正确载入报表文件,装填数据并生成JasperPring对象,利用我以下给出的导出框架稍加改动就可以生成一个带有HTML/PDF/RTF/EXCEL导出功能以及可将HTML预览进行分页的功能模块。
2.2报表预览框架
<%@page contentType="text/html; charset=UTF-8"%>
<%@page import="javax.servlet.*"%>
<%@ page import="net.sf.jasperreports.engine.*" %>
<%@ page import="net.sf.jasperreports.engine.util.*" %>
<%@ page import="net.sf.jasperreports.engine.export.*" %>
<%@ page import="net.sf.jasperreports.j2ee.servlets.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%
JasperPrint jasperPrint = (JasperPrint)session.getAttribute("JasperPrint");
 session.setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint);
String pageTitle = (String)session.getAttribute("pageTitle");
JRHtmlExporter exporter = new JRHtmlExporter();
int pageIndex = 0;
int lastPageIndex = 0;
if (jasperPrint.getPages() != null){
lastPageIndex = jasperPrint.getPages().size() - 1;
}
String pageStr = request.getParameter("pageIndex");
try{
if( pageStr != null)
pageIndex = Integer.parseInt(pageStr);
}catch(Exception e){
//e.printStackTrace();
}
if (pageIndex < 0){
pageIndex = 0;
}
if (pageIndex > lastPageIndex){
pageIndex = lastPageIndex;
}
StringBuffer sbuffer = new StringBuffer();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER, sbuffer);
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "ImageServlet?image=");
exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer(pageIndex));
exporter.setParameter(JRHtmlExporterParameter.HTML_HEADER, "");
exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "");
exporter.setParameter(JRHtmlExporterParameter.HTML_FOOTER, "");
try{
exporter.exportReport();
}catch(Exception e){
e.printStackTrace();
}
%>
这部分代码用于将Servlet生成的JasperReport对象导出成HTML格式,导出所用的Servlet为JasperReport自带的ImageServlet。要特别注意的是我加了颜色部分的代码,即一定要向Session变量中放入一个JasperPrint对象,其keyword为“ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE”,这样ImageServlet就能够获取并自己主动导出报表了。
<html>
<head>
<title><%=pageTitle %></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="CSS/style.css">
</head>
<body>
<table class="titleBarT">
<tr>
<td>        &gt;&gt;
<%=pageTitle %>
</td>
</tr>
</table>
<table width="98%" cellpadding="0" cellspacing="0" border="0" height="22">
<tr>
<td>       
<div class="menu"><a href="PdfServlet"><img src="Images/pdf.gif" border="0"></a></div>
<div class="menu"><a href="RtfServlet"><img src="Images/word.gif" border="0"></a></div>
<div class="menu"><a href="XlsServlet"><img src="Images/excel.gif" border="0"></a></div>
<div class="menu"><a href="">&nbsp;&nbsp;</a></div>
<div>
<%
if (pageIndex > 0)
{
%>
<a href="本页?pageIndex=0"><img src="Images/FirstPage.gif" border="0"></a>
<a href="本页?pageIndex=<%=pageIndex - 1%>"><img src="Images/PreviousPage.gif" ></a>
<%
}
else
{
%>
<img src="Images/FirstPage_disabled.gif" border="0"/>
<img src="Images/PreviousPage_disabled.gif" border="0"/>
<%
}
if (pageIndex < lastPageIndex)
{
%>
<a href="本页?pageIndex=<%=pageIndex + 1%>"><img src="Images/NextPage.gif" ></a>
<a href="本页?pageIndex=<%=lastPageIndex%>"><img src="Images/LastPage.gif" ></a>
<%
}
else
{
%>
<img src="Images/NextPage_disabled.gif" border="0">
<img src="Images/LastPage_disabled.gif" border="0">
<%
}
%>
</div>
</td>
</tr>
</table>
这段代码是将导出成HTML的报表进行分页显示。
<table width="98%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="50%">&nbsp;</td>
<td align="left">
<%=sbuffer.toString()%>
</td>
<td width="50%">&nbsp;</td>
</tr>
</table>
</body>
</html>
这里导出报表内容的代码。用Tomcat作为WebContainer,显示的结果例如以下:
利用这个框架我们能够轻易的实现自己主动分页的功能并将报表导出成我们想要的格式:如PDF,Word,Excel的等。
限于篇幅,这里我不可以展现报表开发的每个细节和过程,可是我已经尽量将Web报表开发的大概过程提取出来,并着重介绍数据源的设制,交叉表的设计,以及Web预览框架这些相信每个做Web报表的人都会遇到的问题及其解决方式,在JasperReport的高端使用文档相对匮乏的情况下,希望我的努力能给你带来一点帮助。

转载于:https://www.cnblogs.com/mengfanrong/p/3809958.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AN IMAGE IS WORTH 16X16 WORDS :TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE(VIT)

最近看transformer用于CV比较热门&#xff0c;特意去进行了解&#xff0c;这里用分类的一篇文章进行讲解。 NLP中的transformer和代码讲解参考我另一篇文章。 论文链接&#xff1a;AN IMAGE IS WORTH 16X16 WORDS :TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 一.思想 其…

人工智能领域的未来和挑战

来源&#xff1a;创新研究摘要&#xff1a;人工智能是一门综合了计算机科学、生理学、哲学的交叉学科。凡是使用机器代替人类实现认知、识别、分析、决策等功能&#xff0c;均可认为使用了人工智能技术。作为一种基础技术&#xff0c;人工智能在很多行业都有广泛应用。五道集团…

2018年科技公司融资纪录十大排行榜!中国四家公司上榜

来源&#xff1a;网易智能摘要&#xff1a;国外媒体近日盘点了2018年全球融资最多的十家机器人技术公司&#xff0c;中国有四家公司上榜&#xff0c;包括商汤科技、优必选、京东和依图科技。获得融资并不能保证取得成功&#xff0c;这是机器人行业在2018年学到的艰难的一课。今…

tensorrt基础知识+torch版lenet转c++ trt

官网文档 API文档 Docker镜像 自定义Plugin仓库 0.安装 1.安装tensorrt 从官网下载.deb包,要注意的是cuda版本 sudo dpkg -i nv-tensorrt-repo-ubuntu1604-cuda10.0-trt7.0.0.11-ga-20191216_1-1_amd64.deb sudo apt update sudo apt install tensorrt Engine plan 的兼…

《自然》预测2019年重大科学事件

携带传感器的象海豹将帮助研究人员收集海洋数据&#xff0c;这是研究南极洲思韦茨冰川任务的一部分。来源&#xff1a;科技日报新年的钟声即将响起&#xff0c;在此辞旧迎新之际&#xff0c;除了埋头总结过去一年的得失&#xff0c;回味一下往事的喜乐&#xff0c;也应该抬头展…

python刷题+leetcode(第三部分)

200.最大正方形 思路:与岛屿&#xff0c;水塘不同的是这个相对要规则得多&#xff0c;而不是求连通域&#xff0c;所以动态规划构造出状态转移方程即可 动态规划 if 0, dp[i][j] 0 if 1, dp[i][j] min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])1 class Solution:def maximalSqu…

在ubuntu 12.04 x64下编译hadoop2.4

自己编译hadoop&#xff1a;x64 1.安装依赖包 sudo apt-get install g autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev openssh-server maven openssh-client 2.下载hadoop源码 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.4.0/hadoop…

中科院脑科学与智能技术卓越创新中心:在“脑海”中突破进取

来源&#xff1a;中国科学报 2017年底&#xff0c;“中中”和“华华”两个可爱的小猴子降临人世&#xff0c;标志着中国率先开启了以体细胞克隆猴作为实验动物模型的新时代。这是继2016年建立食蟹猴自闭症模型后&#xff0c;中科院脑科学与智能技术卓越创新中心再一次取得非人灵…

python(c++)刷题+剑指offer

03. 数组中重复的数字 思路:hash class Solution:def findRepeatNumber(self, nums: List[int]) -> int:dict_ dict()for i in range(len(nums)):if nums[i] in dict_:return nums[i]else:dict_[nums[i]] i class Solution { public:int findRepeatNumber(vector<int…

erlang开发环境配置

第一步 从源码安装erlang git clone https://github.com/erlang/otp 目前最新版本为17.X cd otp/ ./configer 检查编译环境 sudo make & make install 编译并安装 我是在ubuntu 系统下配置的 其余的linux 环境我是直接切换到root用户操作 这样安装需要自己一个一个解决…

美国免费为全世界提供GPS服务,为什么中国还要搞“北斗”?

来源&#xff1a;雷锋网摘要&#xff1a;12月27日&#xff0c;在国务院新闻办公室新闻发布会上&#xff0c;中国卫星导航系统管理办公室主任、北斗卫星导航系统新闻发言人冉承其宣布——北斗三号基本系统完成建设&#xff0c;于今日开始提供全球服务。这标志着北斗系统服务范围…

IDC与百度联合发报告:预测2019年人工智能十大趋势

来源&#xff1a;网络大数据12月20日&#xff0c;国际数据公司(IDC)与百度AI产业研究中心(BACC)联合发布《百度大脑领导力白皮书》&#xff0c;白皮书预测了2019年中国人工智能市场发展趋势&#xff0c;通过实际案例解析人工智能如何从技术到落地&#xff0c;并提出“100天AI部…

链表的一些leetcode题目+python(c++)

主要常见下面几个知识点: 1-1.请编写一个函数&#xff0c;使其可以删除某个链表中给定的&#xff08;非末尾&#xff09;节点&#xff0c;你将只被给定要求被删除的节点。 python: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # …

暑训day1解题报告

A - Painting the sticks因为不能覆盖涂/涂两次&#xff0c;所以就数数有几个三个一块儿就行了。#include<cstdio> int a[100],ans ; int main() {int n , t 0 ;while (scanf("%d",&n)!EOF) {for (int i1; i<n; i) scanf("%d",ai);ans 0 ; …

2019展望:超级智能崛起,人类智慧与机器智能将深度融合

作者&#xff1a;刘锋 计算机博士 互联网进化论作者摘要&#xff1a;在2019年到来的脚步声中&#xff0c;感觉要写点文字&#xff0c;对2019年的科技趋势进行展望&#xff0c;也算是对2018年思考的总结&#xff0c;这篇展望的文章主要表达经过50年的科技和商业拉动&#xff0c;…

二叉树的一些leetcode题目+python(c++)

二叉树考点主要有: 1.三种遍历方式,以及构造二叉树等&#xff1b; 2.求深度,最长直径&#xff0c;最长路径,公共祖先等等; 3.合并二叉树&#xff0c;翻转二叉树&#xff0c;判断平衡性,对称性等; 4.从前序与中序构造二叉树&#xff0c;中序与后序构造二叉树&#xff0c;二叉…

Eclipse下如何导入jar包

原地址&#xff1a;http://blog.csdn.net/justinavril/article/details/2783182 我们在用Eclipse开发程序的时候&#xff0c;经常想要用到第三方的jar包。这时候我们就需要在相应的工程下面导入这个jar包。以下配图说明导入jar包的步骤。 1.右击工程的根目录&#xff0c;点击Pr…

面对“超人革命”,我们是否已做好准备?

来源&#xff1a;资本实验室人类自诞生以来&#xff0c;就一直处在自然规律的支配之下。但自从第一次制造工具并学会使用火的那一刻起&#xff0c;人类就开始走在了持续摆脱大自然生物束缚的道路上。千里听音、力大无穷、不死之身、翱翔天际、深入大洋……各种神话中无需借助外…

RepVGG

论文链接 一.背景: 现在的一些复杂模型虽然有很高准确度,但是缺点也很明显: 1.多分支,带来了速度的减慢和降低显存的使用率; 2.Mobilenet虽然采用可分离卷积.shufflenet采用分组卷积,带来了flop降低,但是却增加了内存的访问成本(MAC) 二.网络结构 1. 模型 RepVGG在train和…

2018十大科技丑闻,连娱乐圈都甘拜下风

来源&#xff1a;科技日报这一年里&#xff0c;风起云涌的科技界很忙有些人尝到了甜头有些人却吃到了苦头有些事件令人瞠目结舌、难以置信“404”教授梁莹120篇论文凭空蒸发韩春雨论文调查结果被吐槽酸碱体质论与心脏干细胞的创始人双双走下神坛日本福岛核电站污水处理报告错误…