我们上一次成功的利用iReport工具制作了一张报表,并且预览了报表最后的效果,也生成了格式为“jrpxml”、“jrxml”与“jasper”的文件。这次,我们使用jasper提供的java的api去利用在iReport中制作的报表jasper文件来生成真正的报表文件。
本文以生成pdf格式的报表文件为例,该报表文件包含所有男用户的信息。
首先我们打开MyEclipse,在其中创建一个java工程:
新建一个lib文件夹,然后在lib中加入我们准备好的jar包:
然后将这些jar包全部添加到环境中(右键build path)
然后编写获取数据库连接的类,用于连接数据库并获取相应连接对象,以便于后期操作数据库:
package com.cn.org.ireport.test;
import java.sql.Connection;
import java.sql.DriverManager;
public class JDBCConnection {
public static Connection getConnection(){
try {
String url = "jdbc:mysql://localhost:3306/db_film";
Class.forName("org.gjt.mm.mysql.Driver");
Connection con = DriverManager.getConnection(url, "root", "1234");
return con;
}catch(Exception e){
e. printStackTrace();
}
return null;
}
}
接下来编写dataSource类(也就是数据填充类),实现JRDataSource接口,通过放在list里面的Map对象迭代实现数据对应:
package com.cn.org.ireport.test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
/**
* dataSource类(也就是数据填充类),实现JRDataSource接口
* 通过放在list里面的Map对象迭代,实现数据对应
*/
public class ReportDataSource implements JRDataSource{
private Iterator iter;
//创建一个,map对象用与数据对应
Map map = new HashMap();
//无参的构造函数
public ReportDataSource(){
}
//以sex为参数的有参构造函数,用于数据初始化
public ReportDataSource(String sex){
//通过性别获取相应用户的数据
List datas=DateSourceBaseFactory.createBeanCollection(sex);
//要将List中的数据迭代,需要使用Iterator迭代对象
iter=datas.iterator();
}
//通过key获取value值
public Object getFieldValue(JRField arg0) throws JRException {
return map.get(arg0.getName());
}
//接口JRDataSource的方法,判断是否有下一个数据
public boolean next() throws JRException {
if(iter.hasNext()){
map=(Map)iter.next();
return true;
}
return false;
}
}
接下来实现上个类中的DateSourceBaseFactory(提供数据的数据源工厂),它是实际从数据库中取出相应数据,然后将其封装在map中,然后又将相应的map装在List容器中。
package com.cn.org.ireport.test;
import java.sql.Connection;
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;
/**
* Map中的键值要与模板中的file值对应
* */
public class DateSourceBaseFactory {
public static List createBeanCollection(String sex) {
int num=0;
if(sex.equals("男")){
num=1;
}else{
num=2;
}
ResultSet rs=null;
Statement st=null;
Connection con=null;
List datas=new ArrayList();
try {
con=JDBCConnection.getConnection();
st=con.createStatement();
rs=st.executeQuery("select name,brithday,province,Email from user where sex="+num);
while(rs.next()){
Map attris=new HashMap();
attris.put("name", rs.getString("name"));
attris.put("brithday", rs.getString("brithday"));
attris.put("province", rs.getString("province"));
attris.put("Email", rs.getString("Email"));
datas.add(attris);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(rs!=null) rs.close();
if(st!=null) st.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return datas;
}
}
接下来编写dataSource的javaBean类。用于创建模板
package com.cn.org.ireport.test;
import java.io.Serializable;
public class DataSoruceBean implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private String brithday;
private String province;
private String Email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBrithday() {
return brithday;
}
public void setBrithday(String brithday) {
this.brithday = brithday;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getEmail() {
return this.Email;
}
public void setEmail(String email) {
this.Email = email;
}
}
接下来是重头戏,编写测试入口类,生成pdf文件。JasperFillManager中有多个生成文件的方法
,除了可以生成pdf文件外还可以生成ofice文档文件。这里我们就将取出的数据打印到报表中去:
package com.cn.org.ireport.test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRAbstractExporter;
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.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRPdfExporterParameter;
public class TestReportHere {
public static void main(String[] args) {
Map parameters=new HashMap();
ByteArrayOutputStream outPut=new ByteArrayOutputStream();
FileOutputStream outputStream=null;
File file=new File("F:/Temp/report.pdf");
String reportModelFile="C:/Users/jack/report2.jasper";
try {
JasperPrint jasperPrint=JasperFillManager.fillReport(reportModelFile,
parameters,new ReportDataSource("男"));
JRAbstractExporter exporter=new JRPdfExporter();
//创建jasperPrint
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
//生成输出流
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outPut);
//屏蔽copy功能
exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED,Boolean.TRUE);
//加密
exporter.setParameter(JRPdfExporterParameter.IS_128_BIT_KEY,Boolean.TRUE);
exporter.exportReport();
outputStream=new FileOutputStream(file);
outputStream.write(outPut.toByteArray());
} catch (JRException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{
try {
outPut.flush();
outPut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
我们点击右键“Run JavaAppliacrion”,来执行我们的报表生成样例。
运行结果,我们在F盘下的Temp下发现了新生成的pdf文件:
双击打开,就是我们之前需要的数据的报表信息。
注意:报表Pdf时,会出现中文无法显示问题,可以设置相关组件的以下属性。需同时设置,其他字体,可自行尝试。
1、Font name :宋体
2、pdf Font name is now deprecated:STSong-Light
3、pdf Encoding : UniGB-UCS2-H(China Simplified)
至此我们实现了使用jasper提供的java的api来实现封装数据打印报表的功能。
转载请注明出处:http://blog.csdn.net/acmman/article/details/51814243