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、报表安装与配置
3、iReport入门
4、iReport使用
iReport使用过程中将需要用到的jar文件放到工具下的lib文件夹下,例如oracleDriver的jar包。
iReport制作的报表可视化文件后缀是.jrxml,编译此文件后将生成模板文件后缀名是.jasper。(如图2.1)
使用JavaBean做为数据源的话,制作一个javaBean将其打为jar文件,在iReport工具中的Options选项下的Classpath中使用添加jar将文件引入。在DataReport query中选择JavaBean Data Source将jar文件中的类名字输入到Class name位置点击右边按钮就可以了,javaBean中定义的字段就显示出来了选择自己需要用的字段点击add按钮。
写一个DataSourceFactory类打成jar文件,并在classpath中将文件引入,然后在DataConnections/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.bean
2.
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 = password
29. }
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.* 创建jasperPrint
38.*/
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.