【iReport+JasperReport】2.在Java工程中利用jasper导出PDF报表

我们上一次成功的利用iReport工具制作了一张报表,并且预览了报表最后的效果,也生成了格式为“jrpxml”、“jrxml”与“jasper”的文件。这次,我们使用jasper提供的java的api去利用在iReport中制作的报表jasper文件来生成真正的报表文件。

本文以生成pdf格式的报表文件为例,该报表文件包含所有男用户的信息。

首先我们打开MyEclipse,在其中创建一个java工程:

新建一个lib文件夹,然后在lib中加入我们准备好的jar包:
【iReport+JasperReport】2.在Java工程中利用jasper导出PDF报表_第1张图片
然后将这些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文件:
【iReport+JasperReport】2.在Java工程中利用jasper导出PDF报表_第2张图片
双击打开,就是我们之前需要的数据的报表信息。
【iReport+JasperReport】2.在Java工程中利用jasper导出PDF报表_第3张图片
注意:报表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

你可能感兴趣的:(pdf,IREPORT,jasperReport,Jasper,jrxml)