1、下载JReport:http://down10b.zol.com.cn/bianchengtools/333513_ireport300.zip?key=287ff4fc316487d19e8c5537ba13d7e4
图文教程下载:http://files.blogjava.net/luodaijun/ireport%E5%9B%BE%E6%96%87%E6%95%99%E7%A8%8B.zip
2、下载安装MySQL:http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.5/mysql-5.5.11-win32.msi
在test中建个test表,有id和name字段
3、安装JDK、eclipse,这个就不用说了吧。
请参考 图文教程 中的操作,自己动手做出一张报表,这里我不在细说,只要展示id和name字段就行了。
保存为classic.jrxml文件,我放在E:\rpt下面。注意,这个一般放在项目目录中,以后使用相对路径,现在我使用的绝对路径,我只是测试一下,到时候要使用流来读取。
在eclipse中建立一个java项目
TestBean类,是一个普通bean,跟数据库中字段一样就好了,有set get方法
public class TestBean { public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } private int id; private String name; }
Test类是调用的报表的类,
import java.io.File; import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.view.JasperViewer; public class Test { /** * @param args */ public static void main(String[] args) { try { JasperReport jr = null; JasperPrint jp = null; FileInputStream fis = new FileInputStream(new File( "E:\\rpt\\classic.jrxml")); jr = JasperCompileManager.compileReport(fis); Map<String, String> map = new HashMap<String, String>(); // map.put("id", "test"); //这里是传参数的 必须先在ireport 中定义好 参数 // map.put("name", "test"); JRDataSource dataSource = new JRBeanCollectionDataSource(getTest()); jp = JasperFillManager.fillReport(jr, map, dataSource); JasperViewer.viewReport(jp); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection() { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost/test"; String userName = "root"; String password = "root"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, userName, password); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return conn; } public static List<TestBean> getTest() { List<TestBean> list = new ArrayList<TestBean>(); String sql = "select id,name from test"; Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery(sql); while (rs.next()) { TestBean tb = new TestBean(); tb.setId(rs.getInt("id")); tb.setName(rs.getString("name")); list.add(tb); } } catch (SQLException e) { e.printStackTrace(); } try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } return list; } }
具体代码见附件。
1、必须使用JDK5,我刚开始使用JDK6一直报错,找不到原因,各位不要再绕弯路了
2、使用了FileInputStream来读取E:\rpt\classic.jrxml这个文件,这个是绝对路径
3、我使用了JRBeanCollectionDataSource ,报表中有自己的DataSource,我不知道怎么使用,就用JDBC写了一个。但是从项目角度考虑,我们一个项目肯定使用一个数据源,所以如果每次调用报表,都使用报表自己的数据源是不可取的,但是自己的DataSource确很好维护,直接改变SQL语句就能修改了,所以请达人告诉我怎么直接调用JReport的DataSource,不胜感激。
4、项目中所用的lib可以在ireport的软件的lib下面找到,只有MySQL的JDBC需要自己去下载驱动。