学习完jasperreports+ireport,给我感觉深刻,不仅掌握了报表开发技术,还掌握了如何在web中生成pdf,xls,rtf文件,以下是jasperreports+ireport开发知识点: 1.字段,变量,参数,传参 2.矢量图,位图 3.超链接,锚
4.数据源,自定义数据源 5.国际化(I18N) 6.脚本 7.子报表
8.图表(饼图,柱图,线图) 9.导出pdf,xls,html...
操作版本:jasperreports2.0.2+ireport2.0.2
说明:本文并非入门级教程,所以阅读本文需要有一定基础.
以下针对每个知识点,讲解在ireport中是如何操作,以及在真实项目中如何部署.
1.字段,变量,参数,传参
这个知识点很简单,在ireport的 view 菜单下有 Fields,Variables,Parameters三个菜单,如要定义一个参数,可进行如下操作.
点击 Parameters 菜单,此时弹出一个操作参数的窗口,单击 New 按钮,输入参数名(Parameter Name),选择参数类型(Parameter Class Type),如要赋一个默认值则填写默认值表达式(Default Value Expression)(默认值如为字符串则以\形式填写,如为整形则以 new Integer(1) 形式填写,以此类推.),填好后,点 OK 就新建了一个参数了.
定义字段与定义参数是一样的操作,至于定义变量操作差不多,也相对少用一些,在此就不讲述.
在ireport中如何引用字段,变量,参数? 引用字段使用 $F{field_name} 引用变量使用 $V{variable_name}
引用参数使用 $P{param_name} 或 $P!{param_name}
$P!{param_name}一般用于拼接sql语句,它的值可以与sql语句拼接后,再去执行查询. 例:定义一个参数名为 where 类型为String 默认值为 \id=100\有一查询语句:select * from user $P!{where}
则执行查询时会替换成:select * from user where id=100
$P{param_name}在sql语句中使用时,也有一特殊情况.
例:有一参数名为 id,类型为Integer,默认值为 new Integer(100) 有一查询语句:select * from user where id=$P{id}
执行查询可正常查询,但如果有一参数名为 name,类型为String,默认值为\有一查询语句:select * from user where name=$P{name}
执行查询时出错,不知道为什么(即使数据库中有该条记录),不知是不是bug,还是自已哪里弄错了.解决办法是,将查询语句改为:select * from user where name='$P!{name}'
可以证明$P!{}语法,只做替换操作,如上只将$P!{name}替换成zhanngle.
也可以证明$P{}语法,在sql语句中使用时,值为数字类型还可以正常执行,如为字符串类型则会出错.
在程序中如何传参?
如上例定义了一个name参数,那么在程序中如何动态传参查询出不同的记录呢,也很简单. 程序代码如下:
Map params=new HashMap(); params.put(\
JasperPrint print=JasperFillManager.fillReport(jasper, params,conn);
就是将参数名和值put进入一map,然后再填充报表时将map传过去就行了.
2.矢量图,位图
Jasperreports支持矢量图与位图功能,是因为他封装了jfreechart(jfreechart是一个开源的图形解决方案库),使用ireport绘制矢量图或插入位图,可以不用我们写一行代码,这些
jasperreports已经为我们全部封装好了,ireport只提供了三种矢量图,分别是矩形,圆形,线条,下面先介绍如何绘制矢量图,再介绍如何插入位图.
初始工作:先新建一个空报表
绘制矩形:点击工具栏的 Rectangle 按钮,在Detail区域,绘制一个矩形,绘制方法与windows自带的画图工具一样,绘制好后,在该矩形上点右键,选属性,即可设置该矩形的属性,大家可以根据自己需要进行设置,如设置前景色,背景色...
绘制圆形与绘制线条方法一样,只需要在工具栏点相应的圆形工具或线条工具就行了. 很简单吧. 问题出现
1. 图与图之间(更具体的说法,应该是元素与元素之间)不能有任何重叠,如重叠则只能显示
最上层的图.
2. 使用线条工具可以绘制斜线,当导出为pdf文件,没有任何问题,当导出html,xls文件时,
发现斜线变成了矩形,解决方案是:使用外部图形编辑软件,绘制一条斜线,并保存为图片文件,再将这个图片文件插入到报表相应位置中.
在ireport中如何测试预览pdf,html,xls…文件?
1.首先要设置一下pdf文件有什么预览,html文件用什么预览…
点Options -> Settings -> External Programs,在弹出的窗口中填写正确的外部程序。
如我的设置如下:
External Editor: C:\\Program Files\\EditPlus 2\\editplus.exe (jrxml文件编辑器) PDF Viewer: D:\\Program Files\\Adobe\\Acrobat 7.0\\Reader\\AcroRd32.exe HTML Viewer: C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE XLS Viewer: \Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE\RTF Viewer: C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe 该步操作只要设置一次,以后就不需要再设置了。
2.设置你要预览的是什么文件,ireport默认预览的是pdf文件,但不是使用我们配制的外部程序预览的,而是使用jasperreports的JRViewer预览的。你也可以设置使用我们配制的外部程序来预览,点Build -> PDF Preview,再点Execute (empty data sour
ce)按钮,即可预览PDF文件。点Build -> HTML Preview,再点Execute (empty data source)按钮,即可预览HTML文件。
注意:任何一个报表都必须要有一个数据源来为报表提供数据。
Execute (empty data source)的意思就是构造一个只有一条记录的数据源传给报表,并且这条记录的值都是null,这个按钮在测试报表不需要数据时,非常有用。
Execute (whit active connection)的意思就是将当前激活的连接或数据源传给报表,并生成报表。 位图
插入位图也很简单,在工具栏上点击 Image 按钮,然后在 Detail 区域绘制一个”矩形”(与绘制矩形操作相同),此时可以在你绘制的区域看到一个图片,在这个图片上点右键,选属性,选 Image 选项卡,点 “Find …”按钮,选择你要插入的图片,OK后,就可以看到你要插入的图片了.
在真实项目中如何插入图片,动态改变图片?
在真实项目中可不能使用上面介绍的方法来插入图片,上面的方法只是启到 hello world 的作用,要想在真实项目中插入图片,可以按照以下方法来配制. 1. 定义一个参数名为 imageName 类型:String 没有默认值
2. 在报表设计界面中绘制一个Image,打开该Image的属性框,选Image选项卡,在Ima
ge Expression文本框中输入:$P{imageName},代表该图片的路径是由imageName的参数值来决定的,我们可以在程序中传入该参数的值. 如何在程序中传入该参数值呢? 示例代码如下:
ServletContext context=request.getSession().getServletContext(); Map params=new HashMap();
Params.put(“imageName”,context.getRealPath(“/reports/test.jpg”)); JasperPrint print=JasperFillManager.fillReport(jasper, params,conn);
传入不同的路径值即可动态改变图片
在html中如何显示图片?
当导出带有图片的报表到pdf,xls文件时,没有任何问题,但导出到html文件时,发现图片不能正常显示,不要急,jasperreports已经为我们提供了解决方案.解决步骤如下: 1.将以下代码添加到web.xml文件中
ServletContext context=request.getSession().getServletContext(); Map params=new HashMap();
Params.put(“imageName”,context.getRealPath(“/reports/test.jpg”)); Map imageMap=new HashMap();
request.getSession().setAttribute(\
JasperPrint print=JasperFillManager.fillReport(jasper,params,conn); request.getSession().setAttribute(net.sf.jasperreports.j2ee.servlets.ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,print);
JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, response.getWriter());
exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP,imageMap);