IReport+JasperReports实现Flash报表显示(带查询功能)
2014-06-11 20:29
561 查看
[b]一.带查询功能的报表展示[/b]
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中有源码)
3.2.5新建一个Servlet(核心代码如下)
4.编译好之后就可以填充数据了(废话不说,直接上代码)
展示页面代码(.jsp)
上面代码主要是在.jsp页面中嵌套.swf显示,整个页面的样式,需要根据需求自己添加
页面提交代码(这里我是用的ajax异步提交)
5.接下来需要改一下jasperreports.jar中的源代码(解决多用户登录查询到的结果可能一致问题和第一次加载jsp页面没有得到session报错问题)
首先修改net.sf.jasperreports.j2ee.servlets包下BaseHttpServlet,java 大概在源码中55行左右
至此一个简单实现flash报表查询的功能实现了
如果需要源码的朋友可以去http://download.csdn.net/detail/jorbiee/7484635下载源码
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 4000 )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下载源码
相关文章推荐
- 使用json实现查询条件传回Action进行hql语句拼接查询实现在结果中查询功能在datagrid中显示查询结果
- 扩展arcgis flex symbol 显示报表功能,显示饼状图和柱状图,非用infoSymbol实现
- iReport实现报表的打印功能
- 单选按钮实现alv格式显示和报表下载功能
- Bootstrap Table 实现简单的查询和显示功能
- WMS仓储管理系统实现"收发存日报表"数据查询功能Sql语句--Oracle
- ArcGIS API For Javascript之地图基本加载与显示,地图切换、缩放、定位、比例尺、鹰眼图、坐标显示、查询搜索功能实现
- 扩展arcgis flex symbol 显示报表功能,显示饼状图和柱状图,非用infoSymbol实现(三)
- jasperreports flash预览报表功能
- 如何实现报表中高亮显示文本功能
- Bootstrap Table 实现简单的查询和显示功能
- 扩展arcgis flex symbol 显示报表功能,显示饼状图和柱状图,非用infoSymbol实现(二)
- 简单方法实现webbrowser不显示图片flash的功能。
- SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表
- DEVExpress XtraReport报表制作过程中绑定数据源的XRControl对象在值为0时不显示功能,通过代码自动实现
- Bootstrap Table 实现简单的查询和显示功能
- 如何用存储过程实现下面功能:以表名为参数,查询出这个表中的所有数据
- (转)下面的代码实现从SQL Server数据库提取图片并显示在DataGrid的功能。
- 排序和查询列的用户定义功能的实现方法
- 使用valuelist实现查询结果集的分页显示