报表生成 - 使用JasperReport(iReport)进行WEB开发
?
2、iReport简介
iReport也是开源组织sf.net中的一款免费软件,是为JasperReport设计的强大的,直观的,易于使用的可视化报表设计器,采用纯Java开发。这个工具允许用户可视化编辑包含charts、图片、子报表等的复杂报表。iReport 还集成了JFreeChart图表制作包,允许用户可视化地编辑XML(JasperDesign)文件。用于打印的数据可以通过多种方式获取包括:JDBC, TableModels, JavaBeans, XML,Hibernate(支持HQL查询语言), CSV等。它支持多种输出格式包括:PDF,RTF,XML,XLS,CSV,HTM。
注意下载的iReport一定要与你所使用的JasperReport 版本相匹配,当然您也可以更新iReport 中所使用的JasperReport 组件。
二、JasperReport+iReport开发
1、报表设计一般过程
2、报表安装与配置
JDK安装3、iReport入门
新建报表文
?
?
?
报表设计注意事项
(1)报表模板中每一个text或者file文本域属性common中的Position Type是很有用的一个属性,在使用中如果遇到了文本域需要浮动则选择float。其他相应一些技巧均在属性中可以找到,在模板制作过程中应多注意,这里不再多说。
(2)报表模板正文区域:
title:title段只在整个报表的第一页的最上面部分显示,除了第一页以外不管报表中有多少个页面也不会出现title段的内容。
pageHeader:pageHeader段中的内容将会在整个报表中的每一个页面中都会出现,显示位置在页面的上部,如果是报表的第一页,pageHeader中的内容显示在title段的下面,除了第一页以外的其他所有页面中pageHeader中的内容将显示在页面的最上端。
columnHeader:针对detail段的表头段,一般情况下在这个段中画报表中列的列标题,每页均会出现一次。
detail:报表内容段,在这个段中设计报表中需要重复出现的内容,detail段中的内容每页都会出现。
columnFooter:针对detail段的表尾段,每页均会出现一次。
pageFooter:显示在所有页面的最下端,每页都显示,最后一页由lastPageFooter代替。
lastPageFooter:最后一页页尾段内容,只在最后一页出现一次。
summary:报表合计段,出现在整个报表的最后一页的detail段的后面,一般用来统计报表中某一个或某几个字段的合计值。
4、iReport使用
iReport使用过程中将需要用到的jar文件放到工具下的lib文件夹下,例如oracleDriver的jar包。
iReport制作的报表可视化文件后缀是.jrxml,编译此文件后将生成模板文件后缀名是.jasper。(如图2.1)
使用JavaBean做为数据源的话,制作一个javaBean将其打为jar文件,在iReport工具中的Options选项下的Classpath中使用添加jar将文件引入。在Data?Report query中选择JavaBean Data Source将jar文件中的类名字输入到Class name位置点击右边按钮就可以了,javaBean中定义的字段就显示出来了选择自己需要用的字段点击add按钮。
写一个DataSourceFactory类打成jar文件,并在classpath中将文件引入,然后在Data?Connections/Datasources选择new再弹出的对话框中选择JavaBeans set data source 然后将刚刚jar文件中的factory类对应的名字写下来就可以了。
最后在iReport中动态执行报表就可以了。
5、iReport生成文件中的字体问题
iReport在生成文件时有可能会遇到中问乱码的问题,那么在制作模板时就要注意中文字段属性要正确的选择,而且3个针对于pdf中文乱码问题的jar文件(iTextAsian.jar, itext-1.3.1.jar, iTextAsianCmaps.jar(该文件我似乎没有))不能少。还有一点就是关于中文字符问题可以将操作系统自带的字体文件copy到iReport对应的文件夹中就可以使用,在web工程中要放的class文件夹下。例如中文宋体字体文件(C:\WINDOWS\Fonts 文件夹下的文件)copy到web工程下的class文件夹下。
6、java代码实例
1.package?report; ?? 2.?? 3.import?java.sql.Connection; ?? 4.import?java.sql.DriverManager; ?? 5./**6.*数据库的连接类7.*/8.public?class?JDBCConnection?{ ?? 9.public static Connection getConnection(){10.try {11.String url = "jdbc:oracle:thin:@127.0.0.1:1521:ruanko";12.Class.forName("oracle.jdbc.driver.OracleDriver");13.Connection con = DriverManager.getConnection(url, "little", "little");14.return con;15. }16. }catch(Exception e){17. e. printStackTrace();18. }19. return null;20.}
java 代码1.package report.datasource;2.3.import java.util.HashMap;4.import java.util.Iterator;5.import java.util.List;6.import java.util.Map;7.8.import net.sf.jasperreports.engine.JRDataSource;9.import net.sf.jasperreports.engine.JRException;10.import net.sf.jasperreports.engine.JRField;11./**12.* dataSource类(也就是数据填充类),实现JRDataSource接口13.* 通过放在list里面的Map对象迭代实现数据对应14.*/15.public class ReportDataSource implements JRDataSource {16.17.private List datas = DateSourceBaseFactory.createBeanCollection(String id);18.19.private Iterator iter = datas.iterator();20.21.Map map = new HashMap();22.23.public ReportDataSource() {24.}25.26.public ReportDataSource(String id) {27.}28.29.public boolean next() throws JRException {30.if(iter.hasNext()){31.map = (Map) iter.next();32.return true;33.}34.return false;35.}36.37.public Object getFieldValue(JRField arg0) throws JRException {38.return map.get(arg0.getName());39.}40.41.} ??
java代码1.package report.factory;2.3.import report.JDBCConnection;4.import java.sql.Connection;5.import java.sql.ResultSet;6.import java.sql.SQLException;7.import java.sql.Statement;8.import java.sql.Timestamp;9.import java.util.ArrayList;10.import java.util.HashMap;11.import java.util.List;12.import java.util.Map;13./**14.* Map中的键值要与模板文件的file值对应。15.*/16.public class DataSourceBaseFactory {17.18.public static List createBeanCollection(String id) {19.20.ResultSet rs = null;21.Statement st = null;22.Connection con = null;23.List datas = new ArrayList();24.25.try {26.con = JDBCConnection?.getConnection();27.st = con.createStatement();28.rs = st. executeQuery (“select name,password,sex from people where id = ” id);29.while(rs.next()){30.Map attris = new HashMap();31.attris.put("name", rs.getString(“name”));32.attris.put("password", rs.getString(“password”);33.attris.put("sex", rs.getString(“sex”));34.datas.add(attris);35.}36.} catch (Exception e) {37.e.printStackTrace();38.} finally {39.try {40. if(rs != null) rs.close();41. if(st != null) st.close();42. if(con != null) con.close();43.} catch (SQLException e) {44.e.printStackTrace();45.}46.}47.return datas;48.}49.} 50.??
java 代码1.package report.bean2.3.import java.io.Serializable; 4./**5.* dataSource的javaBean类。用于创建模板6.*/7.public class DataSourceBean implements Serializable {8.9. private static final long serialVersionUID = -4038978834455400007L;10. 11. private String name;12. private String password;13. private String sex;14. 15. public String getName(){16. return name;17. }18. 19. public void setName(String name){20. this.name = name;21. }22. 23. public String getPassword (){24. return password;25. }26. 27. public void setPassword(String password){28. this.password = password29. }30. 31. public String getSex(){32. return sex;33. }34. 35. public void setSex(String sex){36. this.sex = sex;37. }38.39.}java 代码1.package report;2.3.import java.io.ByteArrayOutputStream;4.import java.io.File;5.import java.io.FileOutputStream;6.import java.io.IOException;7.import java.util.Date;8.import java.util.HashMap;9.import java.util.Map;10.11.import net.sf.jasperreports.engine.JRAbstractExporter;12.import net.sf.jasperreports.engine.JRException;13.import net.sf.jasperreports.engine.JRExporterParameter;14.import net.sf.jasperreports.engine.JasperFillManager;15.import net.sf.jasperreports.engine.JasperPrint;16.import net.sf.jasperreports.engine.export.JRPdfExporter;17.import net.sf.jasperreports.engine.export.JRPdfExporterParameter;18./**19.* 测试入口类,生成pdf文件20.* JasperFillManager中有多个生成文件的方法21.* 除了可以生成pdf文件外还可以生成ofice文档文件。22.*/23.public class TestReportHere {24.25.public static void main(String[] args) {26.Map parameters = new HashMap();27.28.ByteArrayOutputStream outPut = new ByteArrayOutputStream();29.FileOutputStream outputStream = null;30.File file = new File("E:/workspace/report.pdf");31.String reportModelFile = "E:/workspace/reportModel.jasper";32.33.try {34.JasperPrint jasperPrint = JasperFillManager.fillReport(reportModelFile, parameters, new ReportDataSource(“123”));35.JRAbstractExporter exporter = new JRPdfExporter();36./**37.* 创建jasperPrint38.*/39.exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);40./**41.* 生成输出流42.*/43.exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,outPut);44./**45.* 屏蔽copy功能46.*/47. exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED,Boolean.TRUE);48./**49.* 加密50.*/51.exporter.setParameter(JRPdfExporterParameter.IS_128_BIT_KEY,Boolean.TRUE);52.exporter.exportReport();53.outputStream = new FileOutputStream(file);54.outputStream.write(outPut.toByteArray());55.}catch (JRException e) {56.e.printStackTrace();57.} catch (Exception e) {58.e.printStackTrace();59.}finally{60.try {61.outPut.flush();62.outPut.close();63.} catch (IOException e) {64.e.printStackTrace();65.}66.}67.} 68.69.}70.