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下載源碼






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