1.简介
JasperReport是一个强大、灵活的JAVA开源报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。
JasperReport生成报表的过程如图所示。
1)File Jasper报表模板文件:xml文件,屏蔽不同目标报表文件的差异,通常使用IReport进行配置,后缀为.jrxml
2)Paramter:参数,图中HashMap部分,用于填充报表模板文件
3)JRDataSource:数据源,用于填充报表模板文件
4)JasperReports Engine:JasperReport库的统称,主要功能如下:
编译File Jasper报表模板文件,通常直接使用IReport进行编译,后缀名为.jasper
加载编译后的.jasper文件
使用Parameter和JRDataSource填充报表
生成对应类型的报表文件
2.一般步骤
1)使用IReport配置JasperReport模板文件,注:IReport必须要和程序中使用的JasperReport版本相匹配
2)将IReport编译生成的.jasper文件放在应用可见的文件夹中
3)导入JasperReport库到应用中
4)编写代码
3.实例
下面我将按上述过程实现一个学生成绩单
1)IReport配置JasperReport模板文件
本人使用的IReport版本为5.1.0,对应的JasperRepor版本为5.1.0以上,过程略,配置结果如下图所示:
JXML文件&JASPER文件
附件iReport_files.zip
注:由于配置Parameter和DataSource时需要指定数据类型,所以已经编写了应用的部分代码,并且将应用的classpath导入到IReport中
2)将IReport编译生成的.jasper文件放在应用可见的文件夹中
3)导入JasperReport库到应用中
本次实例将生成xls和pdf两种格式的报表,所以使用的类库有,这些类均可在JasperReport和IReport下载包中获取
4)编写代码
--Student.java
package com.siyuan.jptest.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Student implements Serializable{
private static final long serialVersionUID = -7272480669298422204L;
private long id;
private String name;
private Date birth;
private String sex;
private int gradeNO;
private int classNO;
private List<Subject> subjects = new ArrayList<Subject>();
public Student() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getGradeNO() {
return gradeNO;
}
public void setGradeNO(int gradeNO) {
this.gradeNO = gradeNO;
}
public int getClassNO() {
return classNO;
}
public void setClassNO(int classNO) {
this.classNO = classNO;
}
public List<Subject> getSubjects() {
return subjects;
}
public void setSubjects(List<Subject> subjects) {
this.subjects = subjects;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", birth=" + birth
+ ", sex=" + sex + ", gradeNO=" + gradeNO + ", classNO="
+ classNO + "]";
}
}
--Subject.java
package com.siyuan.jptest.entity;
import java.io.Serializable;
public class Subject implements Serializable{
private static final long serialVersionUID = -3255077398595884176L;
private long id;
private String name;
private int mark;
public Subject() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMark() {
return mark;
}
public void setMark(int mark) {
this.mark = mark;
}
@Override
public String toString() {
return "Subject [id=" + id + ", name=" + name + ", mark=" + mark + "]";
}
}
--JPReportGenerator.java
package com.siyuan.jptest.report;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import com.siyuan.jptest.entity.Student;
import com.siyuan.jptest.entity.Subject;
public class JPReportGenerator {
/**
* @param args
* @throws ParseException
* @throws JRException
*/
public static void main(String[] args) throws ParseException, JRException {
Student stu = new Student();
stu.setId(21105001626L);
stu.setName("张三");
stu.setBirth(new SimpleDateFormat("yyyy-MM-dd").parse("1996-10-11"));
stu.setSex("男");
stu.setGradeNO(3);
stu.setClassNO(1);
List<Subject> subs = new ArrayList<Subject>();
Subject sub1 = new Subject();
sub1.setId(1);
sub1.setName("语文");
sub1.setMark(80);
subs.add(sub1);
Subject sub2 = new Subject();
sub2.setId(2);
sub2.setName("数学");
sub2.setMark(90);
subs.add(sub2);
Subject sub3 = new Subject();
sub3.setId(3);
sub3.setName("英语");
sub3.setMark(88);
subs.add(sub3);
stu.setSubjects(subs);
Map<String, Object> params = new HashMap<String, Object>();
params.put("studentInfo", stu);
JasperPrint jpPrint = JasperFillManager.fillReport(
"F:/workspace-test/jptest/bin/com/siyuan/jptest/report/studentReport.jasper",
params,
new JRBeanCollectionDataSource(subs));
JRXlsExporter xlsExporter = new JRXlsExporter();
xlsExporter.setParameter(JRExporterParameter.JASPER_PRINT, jpPrint);
xlsExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "studentReport.xls");
xlsExporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, true);
xlsExporter.setParameter(JRXlsExporterParameter.IS_FONT_SIZE_FIX_ENABLED, false);
xlsExporter.exportReport();
JRPdfExporter pdfExporter = new JRPdfExporter();
pdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, jpPrint);
pdfExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "studentReport.pdf");
pdfExporter.exportReport();
}
}
5)运行结果
略(生成的报表像素大小和IReport配置的不一致,暂没找到合适的解决方法)
4.参考资料
jaspersoft官网地址:
http://community.jaspersoft.com/
jasperreport最新下载地址:
http://community.jaspersoft.com/project/jasperreports-library/releases
ireport最新下载地址:
http://community.jaspersoft.com/project/ireport-designer/releases
jasperreport简介
http://baike.baidu.com/view/1662522.htm
jasperreport pdf中文显示
http://hzz6222003.blog.163.com/blog/static/49716601201282443049323/
jasperreport常用参数说明