关于iReport和JasperReport的简明手册
By Gem 伍子轩
JasperReport的开发环境必须要导入以下所有包:
1. JasperReport包,如jasperreports-0.6.1.jar;
2. Aparche Common包,包括logging、digester、beanutils、collections、logging-api;
3. iText包,包括itext-1.1.jar和iTextAsian.jar(用于输出中文字符到PDF文件)
以上所有包(除了iTextAsian.jar)都已经包含在iReport/lib目录下。
用iReport可视化编辑生成的文件是jrxml文档,这是一种xml文件,记录了一份report的详细信息,我们可以直接用写字板打开它编辑,iReport就是一个方便我们生成和编辑jrxml文件的工具,它也可以很方便地将jrxml文件编译成jasper报表文件。
jrxml文件通过Jasper编译之后就变成了jasper文件,这份文件才是真正在程序中调用生成报表的report文件。
但是有一点要注意的是,jasper的各个版本编译出来的jasper文件并不兼容,就是说用0.6.1版编译出来的文件用0.6.4版调用是会出错的,而iReport自带的Jasper版本是0.6.1,而jasper的最新版本是0.6.4。所以为了保持通用性,我建议只用iReport来开发编辑jrxml文件,而不编译成jasper文件,在我们的打印报表程序中再即时编译一次。虽然这样效率可能会低了一点,但是保证了不同版本的兼容性。
在我们的程序中,要调用Jasper的话,首先要得到一个数据库的Connection,形如:Connection con = ...
需要往JasperReport传参数的话只需要新建一个Map,以参数名作为key,需要传入的对象作为value,譬如:
Map props = new HashMap();
props.put("name", new String("name"));
需要多个参数只需分别put进Map里去就可以了。
JasperReport有如下几个主要的Manager:
JasperCompileManager将jrxml文件编译成jasper文件或JasperReport对象
JasperFillManager从数据源中获取数据并填充jasper文件或JasperReport对象,产生JasperPrint对象
JasperPrintManager将JasperPrint对象直接输出到打印机打印
JasperExportManager将JasperPrint对象导出成PDF或HTML文件(或流)
JasperRunManager运行一个jasper文件或JasperReport对象并输出到PDF或Html文件(或流)中,我的理解是等于集成了JasperFillManager和JasperExportManager的功能
对于上述对象的详细说明请参阅JasperReport的文档。
例程:
例程:public static void main(String[] args) {
try {
Class.forName("org.gjt.mm.mysql.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://wes:3306/umpdb?useUnicode=true&characterEncoding=GBK", "root", "elite");
File f1 = new File("Account.jrxml");
File f2 = new File("Contact.jrxml");
JasperReport main = JasperCompileManager.compileReport(f1
.getAbsolutePath());
JasperReport report = JasperCompileManager.compileReport(f2
.getAbsolutePath());
Map props = new HashMap();
props.put("subreport", report);
JasperPrint print = JasperFillManager.fillReport(main, props,con);
//JasperPrintManager.printReport(print,true);
JasperExportManager.exportReportToPdfFile(print, "a.pdf");
//JasperRunManager.runReportToPdfFile("Account.jasper", "a.pdf", props, con);
} catch (ClassNotFoundException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (JRException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
1.iReport中新建中文报表的时候记得要输入XML编码GB2312。
2.iReport中定义中文字体的时候,要选择PDF Font Name为STSong-Light(宋体)、MHei-Medium(黑体)、MSung-Light,在PDF Encoding中选择GB-UCS2-H(Chinese Simplified),否则输出到PDF时会乱码。
3.用Report SQL查询之后,可能会出现某些字段没有自动建立Field,就需要在Field中手动定义了。
JasperReport的开发环境必须要导入以下所有包:
1. JasperReport包,如jasperreports-0.6.1.jar;
2. Aparche Common包,包括logging、digester、beanutils、collections、logging-api;
3. iText包,包括itext-1.1.jar和iTextAsian.jar(用于输出中文字符到PDF文件)
以上所有包(除了iTextAsian.jar)都已经包含在iReport/lib目录下。
用iReport可视化编辑生成的文件是jrxml文档,这是一种xml文件,记录了一份report的详细信息,我们可以直接用写字板打开它编辑,iReport就是一个方便我们生成和编辑jrxml文件的工具,它也可以很方便地将jrxml文件编译成jasper报表文件。
jrxml文件通过Jasper编译之后就变成了jasper文件,这份文件才是真正在程序中调用生成报表的report文件。
但是有一点要注意的是,jasper的各个版本编译出来的jasper文件并不兼容,就是说用0.6.1版编译出来的文件用0.6.4版调用是会出错的,而iReport自带的Jasper版本是0.6.1,而jasper的最新版本是0.6.4。所以为了保持通用性,我建议只用iReport来开发编辑jrxml文件,而不编译成jasper文件,在我们的打印报表程序中再即时编译一次。虽然这样效率可能会低了一点,但是保证了不同版本的兼容性。
在我们的程序中,要调用Jasper的话,首先要得到一个数据库的Connection,形如:Connection con = ...
需要往JasperReport传参数的话只需要新建一个Map,以参数名作为key,需要传入的对象作为value,譬如:
Map props = new HashMap();
props.put("name", new String("name"));
需要多个参数只需分别put进Map里去就可以了。
JasperReport有如下几个主要的Manager:
JasperCompileManager |
将jrxml文件编译成jasper文件或JasperReport对象 |
JasperFillManager |
从数据源中获取数据并填充jasper文件或JasperReport对象,产生JasperPrint对象 |
JasperPrintManager |
将JasperPrint对象直接输出到打印机打印 |
JasperExportManager |
将JasperPrint对象导出成PDF或HTML文件(或流) |
JasperRunManager |
运行一个jasper文件或JasperReport对象并输出到PDF或Html文件(或流)中,我的理解是等于集成了JasperFillManager和JasperExportManager的功能 |
对于上述对象的详细说明请参阅JasperReport的文档。
例程:
例程:public static void main(String[] args) {
try {
Class.forName("org.gjt.mm.mysql.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://wes:3306/umpdb?useUnicode=true&characterEncoding=GBK", "root", "elite");
File f1 = new File("Account.jrxml");
File f2 = new File("Contact.jrxml");
JasperReport main = JasperCompileManager.compileReport(f1
.getAbsolutePath());
JasperReport report = JasperCompileManager.compileReport(f2
.getAbsolutePath());
Map props = new HashMap();
props.put("subreport", report);
JasperPrint print = JasperFillManager.fillReport(main, props,con);
//JasperPrintManager.printReport(print,true);
JasperExportManager.exportReportToPdfFile(print, "a.pdf");
//JasperRunManager.runReportToPdfFile("Account.jasper", "a.pdf", props, con);
} catch (ClassNotFoundException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (JRException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
1.iReport中新建中文报表的时候记得要输入XML编码GB2312。
2.iReport中定义中文字体的时候,要选择PDF Font Name为STSong-Light(宋体)、MHei-Medium(黑体)、MSung-Light,在PDF Encoding中选择GB-UCS2-H(Chinese Simplified),否则输出到PDF时会乱码。
3.用Report SQL查询之后,可能会出现某些字段没有自动建立Field,就需要在Field中手动定义了。