使用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简单介绍

2InstanceName=ctl00_ContentPlaceHolder1_EntryEditor1_richTextEditor_richTextEditor&Toolbar=Default#_Toc153974710">     Web报表开发

2

InstanceName=ctl00_ContentPlaceHolder1_EntryEditor1_richTextEditor_richTextEditor&Toolbar=Default#_Toc153974711">.1      环境设置

2.2      报表预览框架

2

InstanceName=ctl00_ContentPlaceHolder1_EntryEditor1_richTextEditor_richTextEditor&Toolbar=Default#_Toc153974713">.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爱不释手,就像我一样。出于实际须要,我会提供一个简单的动态表单的生成框架供各位參考。

2Web报表开发

现今的环境是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高的文件使用情况下的相对稀缺性,我希望我的努力能为您带来一点帮助。

时间: 2024-10-24 15:23:45

使用JasperReport+iReport进行Web报表开发的相关文章

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

用JasperReport+iReport进行Web报表开发 序言 在非常多实际的项目里,报表都是当中十分重要的组成部分,比如把查询结果以报表的形式呈现出来.这里所提到的报表可不是简单的二维表,而是拥有复杂表头的.多维的.能够在执行期从数据库中自己主动读取数据.可自己主动分页.拥有丰富的页面元素(图片,超连接等).支持分组和交叉表.支持打印.最好还能导出到Excel或Word…...(汗L).可是显而易见,报表功能越强大,提供的服务越丰富,其复杂度也就越提高,所以仅靠石器时代的手工方式生成报表是

web报表开发FineReport教程之父子格设置

下面通过web报表开发FineReport来简单介绍一下. 工具/原料 web报表开发 大小:148.2M 适用平台:windows/linux 1. 描述 在上一节中介绍了单元格的扩展,单元格的扩展是针对具体的某一个单元格,当报表主体中绑定了多个单元格时,单元格与单元格之间是否存在联系,其扩展方向是否会相互影响呢? 如下图,在单元格中拖曳两个2个字段,在web端预览的时候,可以看到后面的单元格根据前面的单元格数据进行分组显示: 表明当报表主体中绑定了多个单元格的时候,单元格间会天然存在某种关系

二十三、【开源】EFW框架Web前端开发之常用组件(FusionCharts图表、ReportAll报表等)

回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan.baidu.com/s/1o6MAKCa 前言:上一章讲了EFW框架中的界面框架JqueryEasyUI,在一个Web系统开发中除了需要一个好的界面框架还有需要一些功能,比如:图表展示.Web报表预览打印.文件上传.文本编辑等功能在Web系统开发过程中也是经常用到的:为了方便大家使用EFW框架开发系统,本人

jasperReport+ireport实现报表导出和数据分析

jasperReport + ireport组合实现报表文件(各种文件格式xsl.pdf,rtf等)的生成导出是目前开源报表中使用的最为广泛的.在平台一期完成之后,而且功能中报表以及数据分析这块是必不可少的,一下展示如何使用JasperReport + ireport导出excel报表. 1.需要.jasper文件作为生成报表的模板,这个文件是由ireport文件编译.jrxml文件之后生成的.这个需要注意的是JasperReport和ireport的版本一定要对应,否则很可能出问题.下面的文件

关于Web报表FineReport打印的开发应用案例

报表打印是报表使用和开发过程中经常碰到的问题,这里汇总了关于Web报表开发打印功能的一些典型应用案例,以应用最广泛的FineReport为例. 案例一:java直接调用报表打印 当java后台定义定时打印的功能,同时又需要直接调用报表的打印的时候,由于打印机型号和纸张不同,需要指定打印机,从而打印是否成功并设置返回值.那么怎么样可以实现这一过程呢? 实现过程 1.定义报表运行环境 // 定义报表运行环境,才能执行报表            String envPath = "D:\\FineRe

利用jasperReport制作web报表

作者:54dabang E-mail:[email protected] 一 前言 一直发现在网上寻找资源比较繁琐,前段时间在制作jasperReport报表时候出现了很多问题.特别是在一些细节方面,特别耗费时间.特此写下此文,希望对和我一样在初期阶段学习的同学能少走一些弯路. 二 内容简介 1)给出自己制作的jasperReport的视图效果,方便对报表工具初期学习的选择. 2)自己制作报表的测试源码和所有相关学习资料,对应所有jar包,jasperReport版本. 3)快速开发报表的一些建

JasperReport报表开发(一)--原理介绍

1. JasperReport介绍 JasperReport 是一个开源的Java报表引擎,它不像其他的报表工具,例如Crystal报表是基于Java的,没有自己的表达式语法.Jasper Reports有提供丰富的内容到屏幕上,到打印机,或转换成PDF,HTML,XLS,RTF,ODT,CSV,TXT和XML文件的能力.Jasper Reports是一个Java类库,需要嵌入到Java应用程序中.Jasper Report的特点如下: 具有灵活的报表布局: 可以用文字或图形显示数据: 开发人员

使用pentaho report 开发web报表

使用pentaho report 开发web报表 1.   文档说明 java开源报表软件中,pentaho report算是比较优秀的:能够满足大多数应用,足以和国内商业报表媲美:现记录实际开发报表完整过程教程,让初学者快速入门并应用到项目中. 2.   开发环境说明 1)      工具环境:pentaho report designer5.3.tomcat6.jdk6.Eclipse Java EE (4.3) 2)     mysql以及示例数据库saikla 3)     mysql驱

设计与开发一款简单易用的Web报表工具(支持常用关系数据及hadoop、hbase等)

EasyReport是一个简单易用的Web报表工具(支持Hadoop,HBase及各种关系型数据库),它的主要功能是把SQL语句查询出的行列结构转换成HTML表格(Table),并支持表格的跨行(RowSpan)与跨列(ColSpan).同时它还支持报表Excel导出.图表显示及固定表头与左边列的功能.总体架构如下图所示: 目录 开发环境(Development Environment) 安装与部署(Installation & Deployment) 从源代码安装(From Source Co