IReport+JasperReports实现Flash报表显示(带查询功能)

一.带查询功能的报表展示

1.      首先从官网下载IRport和JasperReports

Jasperreport下载地址:http://sourceforge.net/projects/jasperreports/files/jasperreports/

Ireport下载地址:http://community.jaspersoft.com/project/ireport-designer/releases

注意:Jasperreport的版本要大于等于Ireport的版本不然会报错

本人使用IReport5.1+jasperReports5.5.6

2.      报表开发

         首先使用IReport工具开发.jrxml(网上有很多该工具的使用教程)

         多说一句:使用Ireport绑定数据源时,由于使用的数据库不同所以需要加入不同的数据库驱动包,具体是拷贝相应的数据库驱动包反到Ireport安装目录\platform9\lib下即可。

3.      报表编译(编译成. Jasper文件)

         3.1.使用Ireport工具编译

                   设计好报表之后点击preview就会在报表文件夹生成相应的.jasper文件



     

         3.2使用代码编译(在下载的Jasperreport包中\demo\samples\webapp有详细的源码)

               3.2.1在eclipse中新建一个web工程

              3.2.2导入jar包:新手可以将Jasperreport包中disc和Lib下的包全部导入

我的工程目录



              3.2.3将制作好的.jrxml放入相应的工程目录下

             3.2.4在web.xml还需要配置一个servlet(用于取数据的在下载的Jasperreport包中\demo\samples\webapp下的web.xml中有源码)

<span style="white-space:pre">	</span><servlet>
		<servlet-name>Xml4SwfServlet</servlet-name>
		<servlet-class>net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet</servlet-class>
	</servlet>
<span style="white-space:pre">	</span><servlet-mapping>
		<servlet-name>Xml4SwfServlet</servlet-name>
		<url-pattern>/servlets/xml4swf</url-pattern>
	</servlet-mapping>

     3.2.5新建一个Servlet(核心代码如下)
ServletContext context =this.getServletConfig().getServletContext();
asperCompileManager.compileReportToFile(context.getRealPath("/reports/WebappReport.jrxml"));

4.编译好之后就可以填充数据了(废话不说,直接上代码)

展示页面代码(.jsp)

<div class="content" id="flashView">
			<object class="flashSize">
					<param name="movie" value="flash/jasperreports-flash-4.5.0.swf" />
					<param name="FlashVars"
						value="jrpxml=servlets/xml4swf?jrprint=<%=request.getSession().getId() + "_jrprint"%>;<%=new SimpleDateFormat("HH:mm:ss").format(new Date())
					.replaceAll(":", "")%>" />
					<embed
						src="<%=request.getContextPath()%>/flash/jasperreports-flash-4.5.0.swf"
						<strong>FlashVars="jrpxml=servlets/xml4swf?jrprint=<%=request.getSession().getId() + "_jrprint"%>;<%=new SimpleDateFormat("HH:mm:ss").format(new Date())
					.replaceAll(":", "")%>"</strong>
						class="flashSize">
					</embed>
				</object>
		</div>
注意上面加粗部分了吗,主要是为了解决谷歌浏览器中报表查询结果不显示问题

上面代码主要是在.jsp页面中嵌套.swf显示,整个页面的样式,需要根据需求自己添加

页面提交代码(这里我是用的ajax异步提交)

$("#select").click(function(){
											
//组json串(这样在项目中只需建一个Servlet就可以实现多个查询报表)
//Jasperkey:编译后.jasper的文件名
//paramentrs:参数列表   name:查询条件名称相当于Sql中where子句。(该名//称必须和Ireport设计的查询条件名称相对应)
//Value:查询条件的值(需要动态改变的) type:查询条件值的数据类型
//01:String ,02:int,03:日期(无时分秒),04(有时分秒)
var params = {"jasper" : [ {"jasperkey" : "Test"} ], "parameters" : [ {"name" : "bind_id", "value" : $("#bind_id").val(),"type" : "02"} ] };//如果有多个查询条件只需要添加 <span style="font-family: Arial, Helvetica, sans-serif;">parameters 后面的值</span>
//将json序列化
var paramsString = JSON.stringify(params);
//异步提交表单数据
$.ajax({
			url : "SelectServlet",
			type : "post",
	        data : paramsString,
			datatype : "json",
		contentType : "application/x-www-form-urlencoded; charset=utf-8",
	success : function(data) {
						$("#flashView").html(data);
														},
													});
								});
后台servlet代码(解析json部分)-->必须导入解析json用到的jar包

String jasperkey = "";//获取.jasper文件名称
		String acceptjson = "";// 获取json
		String temp = "";//遍历获取的json串
		//获取前台提交的json数据
		BufferedReader br = new BufferedReader(new InputStreamReader(
				(ServletInputStream) request.getInputStream(), "utf-8"));

		StringBuffer sb = new StringBuffer();
	    //从缓冲区中遍历json串
		while ((temp = br.readLine()) != null) {
			sb.append(temp);
		}
		br.close();
		acceptjson = sb.toString();
		Map parameters = new HashMap();// 需要查询的参数
		if (!"".equals(acceptjson) && acceptjson !=null) {
			JSONObject jo = JSONObject.fromObject(acceptjson); // 将acceptjson转换成json对象

			JSONArray jasper = jo.getJSONArray("jasper");// 获取jasper
			JSONObject jasperObject = JSONObject.fromObject(jasper.get(0));

			jasperkey = (String) jasperObject.get("jasperkey");// 获取.jasper
			// 获取查询的参数

			JSONArray parameter = jo.getJSONArray("parameters");
			for (int i = 0; i < parameter.size(); i++) {
				JSONObject parameterObject = JSONObject.fromObject(parameter
						.get(i));
				if((String)parameterObject.get("value")==null || "".equals((String)parameterObject.get("value"))){
					continue;
				}else{
				String type=(String)parameterObject.get("type");//获取数据类型
				//01:String 02 :int 03::日期(无时分秒) 04:日期(有时分秒)i
				if("01".equals(type)){//传过来的类型是String
					parameters.put(parameterObject.get("name"),(String)parameterObject.get("value"));
					
				}else if("02".equals(type)){//传过来的是int类型
					
				parameters.put(parameterObject.get("name"),Integer.parseInt((String) parameterObject.get("value")));
				
				}else if("03".equals(type)){//传过来的日期没有时分秒
					
					Format f = new SimpleDateFormat("yyyy-MM-dd");
				
		            try {
						Date date = (Date) f.parseObject((String)parameterObject.get("name"));
						   parameters.put(parameterObject.get("name"),date);
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
		         
				}else if("04".equals(type)){////传过来的日期有时分秒
				
					Format f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		            try {
						Date date = (Date) f.parseObject((String)parameterObject.get("name"));
						parameters.put(parameterObject.get("name"),date);
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				}
			}

		}
下面是往报表中填充数据代码

		PrintWriter out = response.getWriter();
		try {

			String reportFileName = context.getRealPath("/reports/" + jasperkey
					+ ".jasper");
			File reportFile = new File(reportFileName);
			if (!reportFile.exists())
				throw new JRRuntimeException(
						"File WebappReport.jasper not found. The report design must be compiled first.");
		
			JasperPrint jasperPrint = JasperFillManager.fillReport(
					reportFileName, parameters, BaseDao.getConnection());//BaseDao.getConnection():得到conn
			request.getSession().setAttribute(request.getSession().getId() + "_jrprint",jasperPrint);
			BaseDao.closeResource();//关闭数据库连接
		} catch (JRException e) {
			e.printStackTrace();
		}
		
		//返回.swf内容用于局部刷新页面
		String bb = "jrprint="+request.getSession().getId()+"_jrprint;"+new SimpleDateFormat("HH:mm:ss").format(new Date()).replaceAll(":", "");
		String falshVale = "<object class=\"flashSize\">"+
				"<param name=\"movie\" value=\"flash/jasperreports-flash-4.5.0.swf\"/>"+
				"<param name=\"FlashVars\" value=\"jrpxml=servlets/xml4swf?"+bb+"\" class=\"flashSize\"/>"+
				"<embed src=\"flash/jasperreports-flash-4.5.0.swf\""+ 
				"FlashVars=\"jrpxml=servlets/xml4swf?"+bb+"\" class=\"flashSize\"></embed></object>";
		 out.write(falshVale);
		
	}

5.接下来需要改一下jasperreports.jar中的源代码(解决多用户登录查询到的结果可能一致问题和第一次加载jsp页面没有得到session报错问题)

首先修改net.sf.jasperreports.j2ee.servlets包下BaseHttpServlet,java 大概在源码中55行左右

String jasperPrintSessionAttr = request.getParameter(JASPER_PRINT_REQUEST_PARAMETER);
		//获取页面传过来的值,并截取日期前面的部分
		 jasperPrintSessionAttr = jasperPrintSessionAttr.split(";")[0];
修改net.sf.jasperreports.j2ee.servlets包下XmlServlet.java 大概在源码65行左右

List jasperPrintList = BaseHttpServlet.getJasperPrintList(request);

		//当第一次加载页面是jasperPrintList为空直接返回
		if (jasperPrintList == null)
		{
			return;
		}


至此一个简单实现flash报表查询的功能实现了

如果需要源码的朋友可以去http://download.csdn.net/detail/jorbiee/7484635下载源码






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章