七、其他相关问题
如何使用图片?
很容易,用Image控件就可以了. 在Image Express 里面可以用String来表示图片的路径, 或者用InputStream, File 对象.不过不管用File 还是String 对象, 都不得不用绝对路径, 这显然很不灵活.解决办法是,穿入一个$P 的参数,表示图片所在的目录,然后用$P 和文件名拼接出完整的绝对路径. 或者通过代码来控制, 比如System.getProperty("user.dir")+"\\report.jpg"就表示图片的绝对路径。更好的方法是用InputStream, 例如his.getClass().getResourceAsStream ("report.jpg") ,这时只要把图片放在当前.jasper所在的 目录就可以了,不必考虑什么参数,什么路径。
动态控制某些Field 是否显示
每个Static Text, Text Field 甚至整个Band 的属性里面都有Print When Expression, 比如设成new boolean(!$P{isDisplay}.equalsIgnoreCase("yes")), 那么只有当参数display的值为yes 的时候才显示。
使用Sub Report, 如何使用相对路径
和使用图片类似,最好使用InputStream 或者传入参数。
Query里面如何使用参数
$P!{xxx} 或者 $P{xxx} 后者只能用于类似PreparedStatement参数绑定, 而前者可替换Sql 的任意部分. 在需要动态排序的时候, 前者特别有用. 比如select a,b,c from t order by $P!{orderClause} 不管用$P 还是$P!, SQL最终是以PreparedStatement 方式执行的, 不必太担心性能问题 注意:参数是不能嵌套的,比如$P{a} =''$P{b}'' , $P{b}=''value'', 不要指望$P{a}能被替换成''value''
如何使用图表(Graph)
JasperReport 本身没有图表功能, 只有显示Image 的功能,iReport 里有个Graph 向导, 其实质是通过jFreeChart 生成Image. 另外, 更直接的做法是放一个Image控件, Image Express Class 设置成java.awt.Image, 在Image Expression 里通过自定义的类返回java.awt.Image对象.
例如GraphProvider.getImage($P{REPORT_DATASOURCE},title, subtitle.....);GraphProvider是自己的类, public static Image getImage(JRDataSource, ....)
如果显示多个图表
在一张报表上显示一个图表和显示多个图表是不同的. 假设Query 是selectname,price,qty from xxx, 第一张图显示name-price, 第二张图显示name-qty, 如果还是按上面的方法, 第二张图根本显示不出来! 为什么 因为传入的是JRDataSource, 而JRDataSource仅仅是对ResultSet的简单封装, 在第一张图处理完后, 游标已经到了eof 位置了, 在开始处理第二张图的时候,就必然抛出游标耗尽的异常! 怎么办?自己写个JRDataSourceAdapter,把JRDataSource对象里面的值预先保存到一个Collection (相当于一个Offline的数据集), 然后把这个Collection传个getImage方法. 具体是, 建一个Variable mydate, 类型是java.util.Map, Calculation Type- System,Initial Value Expression 是JRDataSourceAdapter.JRDataSource2Map($P{REPORT_DATA_SOURCE}, new String[]{"NAME","PRICE","QTY"},
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-30469-5.html
不喊话警告