ireport与jasperreports开发总结.docx
《ireport与jasperreports开发总结.docx》由会员分享,可在线阅读,更多相关《ireport与jasperreports开发总结.docx(8页珍藏版)》请在冰豆网上搜索。
ireport与jasperreports开发总结
一。
下载ireport(官方网站:
),本人下载ireport3.7.0。
二。
搭建ireport+jasperreportsjava开发平台。
将ireport3.7.0安装路径下
D:
\iReport-3.7.0\ireport\modules\ext下的(jasperreports-3.7.jar,
iText- 2.1.0.jar,iTextAsian.jar,commons-logging-1.1.jar,commons-collections-3.2.1.jar,
commons-digester-1.7.jar,poi-3.2-FINAL-20081019.jar,groovy-all-1.5.5.jar)的jar包加入到
javaclassPath下。
其中各jar包的版本以你下载的ireport的\ireport\modules\ext路径下jar为准。
各jar包作用如下:
jasperreports-3.7.jar:
该包的作用完成ireport中Preview按扭功能。
通过该包可以通过java来ireport生成摸班
(.jrxml或.jasper)填充数据源并导出pdf,excel,html等格式文件。
iText-2.1.0.jar:
生成pdf所依赖的包。
iTextAsian.jar:
支持pdf中文字体依赖的包。
groovy-all-1.5.5.jar:
将.jrxml编译成.jasper.如果你不使用java编译,而使用ireport工具编译则无须导入该包。
commons-digester-1.7.jar:
解析.jrxml
poi-3.2-FINAL-20081019.jar:
生成excel报表所依赖的jar
三。
使用javaBean数据源开发子报表例子如下:
第一步:
创建主报表javaBean(货物)如下(set,get方法省列):
publicclassDailySalesimplementsSerializable{
privatestaticfinallongserialVersionUID=1L;
privateStringproductNo;//货物代号
privateStringproductName;//货物名称
privateintnumber;
privateintmoney;//货物价格
privateintid;//货物唯一标识
privateListdailyZooms;//货物销售地区(子报表)
publicDailySales(StringproductNo,StringproductName,intnumber,intmoney,
List dailyZooms){
this.productNo=productNo;
this.productName=productName;
this.number=number;
this.money=money;
this.dailyZooms=dailyZooms;
}
}
第二步:
创建子报表报表javaBean(货物销售地区)如下(set,get方法省列):
publicclassDailyZoomimplementsSerializable{
privateStringname;
privateBigDecimalamounts;
publicDailyZoom(Stringname,BigDecimalamounts){
this.name=name;
this.amounts=amounts;
}
}
注意:
如果在报表中需要排序则上述类必须实现Comparable接口,并实现其方法。
第三步:
创建DailySalesFactory工厂类提供集合数据源如下:
publicclassDailySalesFactory{
privatestaticDailySales[]data={newDailySales("货号1","物品1",1,1000,getDailyZoom()),
newDailySales("货号2","物品2",2,2000,getDailyZoom()),
newDailySales("货号3","物品3",3,3000,getDailyZoom()),
newDailySales("货号4","物品4",4,4000,getDailyZoom()),
newDailySales("货号5","物品5",5,5000,getDailyZoom()),
newDailySales("货号6","物品6",6,6000,getDailyZoom()),
newDailySales("货号7","物品7",7,7000,getDailyZoom()),
newDailySales("货号8","物品8",8,8000,getDailyZoom()),
newDailySales("货号9","物品9",9,9000,getDailyZoom()),
newDailySales("货号10","物品10",10,10000,getDailyZoom())};
publicstaticObject[]getBeanArray(){
returndata;
}
publicstaticCollectiongetBeanCollection(){
returnArrays.asList(data);
}
publicstaticListgetDailyZoom(){
ListdailyZooms=newArrayList();
dailyZooms.add(newDailyZoom("厦门",newBigDecimal(123.00)));
dailyZooms.add(newDailyZoom("南昌",newBigDecimal(456.00)));
returndailyZooms;
}
}
将上述创建的类设置到ireport3.7.0的classPath目录下(工具》选项》classPath),然后配置javaBean数据源如下:
第四步:
设定ireport模版如下:
注意:
(1)pdf中文设定:
首先将iTextAsian.jar設置到classPath下.然後fontspath下勾選iTextAsian.jar路徑和jasperreports-extensions-3.5.3.jar路徑,最後将会显示中文的文本PdfFontnameisnowdeprecated:
STSong-Light,pdfExcoding:
UniGB-UCS2-V(ChineseSimplified)(V是从上往下显示,H是从左往右显示)。
(2)上下和左右表格要对其,否则生成的excel会很乱。
(3)Parameters,Fields,Variables区别:
Parameters是保存从java外部传进来的参数,Fields是Sql或javaBean数据查询返回的字段,Variables是ireport计算或保存值的。
(4)分页:
强行分页可直接使用Break控件,程序控制分页(让它每显示20条就自动分页)在该printwhenexpression里面写表达式,如下:
newBoolean($V{total}.intValue()%20==0) total是数据总量
(5)分組統計的報表.每一分組一頁(在ireport中***groupfoot1勾選startonanewpage).
第五步:
使用数据源开发子报表如下:
注意:
(1)SubreportExpression中$P{SUBREPORT_DIR}+"javaBeanReport_subreport1.jasper"中为子报表编译后文件的路径,其中$P{SUBREPORT_DIR} 是从java中传进子报表路径。
(2)DataSourceExpression:
newnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{dailyZooms})是使用主报表List集合构造子报表JavaBean数据源。
第五步:
从java中加载ireport做好的模板生成报表如下:
将集合转换成javaBeanDataSource:
JRBeanCollectionDataSourcejavaBeanDataSource=newJRBeanCollectionDataSource(results);
将jrxml编译成jasper:
JasperReportjasperReport=JasperCompileMpileReport("c:
/javaBeanReport.jrxml");
生成JasperPrint对象:
JasperPrintjasperPrint=JasperFillManager.fillReport
(jasperReport,parameters, javaBeanDataSource);parameters为要传如的参数Map对象
生成pdf流对象:
JasperExportManager.exportReportToPdfStream(jasperPrint,stream);
调用ireport中JasperViewer查看pdf
JasperViewerjrview=newJasperViewer(jasperPrint);
jrview.setPreferredSize(newDimension(200,100));
jrview.setVisible(true);
生成excel代码如下:
JRXlsExporterexporter=newJRXlsExporter();
exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT,jasperPrint);
exporter.setParameter(JRXlsExporterParameter.OUTPUT_STREAM,streamExcel);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.FALSE);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);
exporter.exportReport();
子报表需注意的java代码:
Mapparameters=newHashMap();
parameters.put("SUBREPORT_DIR","C:
/DocumentsandSettings/user/桌面/");
如果有子报表必须从java端将SUBREPORT_DIR参数传给ireport
大量数据内存处理(磁盘建立目录来优化内存):
JRFileVirtualizer对象如JRFileVirtualizer virtualizer = new JRFileVirtualizer(2, "tmp");
然后数据填充时传一个参数即可如:
Map parameters = new HashMap();
parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
第六步:
显示效果如下:
四:
与与struts2.0整合(导入struts2-jasperreports-plugin-2.0.12.jar包)
default">
/reports/demoReport.jasper
list
PDF
map
location-提供利用iReport制作编译好的报表文件。
dataSource-数据源
format-报表输出格式
reportParameters-报表参数
五:
常见的异常:
(1)spring+jasperReport生成PDF格式的报表时报
java.lang.NoSuchMethodError:
com.lowagie.text.pdf.PdfWriter.setRgbTransparencyBlending(Z)V异常
原因:
iText.jar文件过旧,将之改为2.1版就没事了。
(2)java.lang.NoClassDefFoundError:
org/codehaus/groovy/control/CompilationFailedException异常
原因:
没有导入groovy-all.jar包,导入groovy-all.jar包就可以了。
(3)Excle应用:
java.lang.NoClassDefFoundError:
org/apache/poi/hssf/usermodel/HSSFCellStyle
出现上述错误提示加入poi-3.2-FINAL-20081019.jar
(4)net.sf.jasperreports.engine.JRRuntimeException:
Couldnotloadthefollowingfont:
pdfFontName :
STSong-Light
pdfEncoding :
UniGB-UCS2-H
isPdfEmbedded:
false
出现上述错误提示加入
iTextAsian.jar
(5)java.lang.NoClassDefFoundError:
org/apache/commons/digester/Digester
出现上述错误提示加入commons-digester-1.7.jar iReport/lib 功能简述:
解析xml文件;
(6)java.lang.NoClassDefFoundError:
org/apache/commons/collections/ArrayStack出现上述错误提示加入
commons-beanutils-1.7.jar iReport/lib
(7)java.lang.NoClassDefFoundError:
org/apache/commons/collections/ReferenceMap出现上述错误提示加入
commons-collections-2.1.jar iReport/lib
(8)
异常:
Foundtwocomponentsfornamespace
解决方法.查看是否在工程目录添加了外部jar[jasperreports-X.X.X.jar],[jasperreports-X.X.X-javaflow.jar]
如果有同时添加了这两个jar.移除[jasperreports-3.5.3-javaflow.jar]则可.
六.ireport其他資料