我們上一次成功的利用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來實現封裝數據打印報表的功能。
直接在網頁上下載這個PDF格式文件
/**
* 輸出jasper 報表
*
* @param reportHanderImpi
* @throws AppException
*/
public void exportReport(ReportHanderImpl reportHanderImpl)
throws AppException {
this.getRequest().setAttribute(ReportConstants.REPORT_FLAG, "0");
this.getRequest().setAttribute(ReportConstants.REPORT_PATH_SYMBOL,
reportHanderImpl.getReportFile());
if(reportHanderImpl instanceof CommonReportHandler){
// 報表文件的輸入流
this.getRequest().setAttribute(ReportConstants.REPORT_INPUTSTREAM,
((CommonReportHandler)reportHanderImpl).getReportInputStream());
}
List datalist = reportHanderImpl.getDataList();
JRDataSource dataSource = null;
if (datalist != null && datalist.size()>0) {
dataSource = new JRBeanCollectionDataSource(datalist);// 獲取數據集
} else {
dataSource = new JREmptyDataSource();
}
this.getRequest().setAttribute(
ReportConstants.REPORT_DATASOURCE_SYMBOL, dataSource);
this.getRequest().setAttribute(ReportConstants.DISPLAY_FIELDS_SYMBOL,
reportHanderImpl.getDisplayStr());
//獲取報表類型(表格 or 圖形)
this.getRequest().setAttribute( ReportConstants.REPORT_TYPE_SYMBOL, reportHanderImpl.getReportType());
//報表輸出格式類型(PDF or EXCEL ,HTML)
this.getRequest().setAttribute( ReportConstants.REPORT_OUT_FORMAT_SYMBOL, reportHanderImpl.getFormatType());
this.getRequest().setAttribute(ReportConstants.REPORT_PARAMETER_SYMBOL,
reportHanderImpl.getParamMap());
try {
this.getRequest().getRequestDispatcher("/JReportServlet").forward(
ServletActionContext.getRequest(),
ServletActionContext.getResponse());
} catch (ServletException e) {
new AppException(e);
} catch (IOException e) {
new AppException(e);
}
}
EG2:
@SuppressWarnings("rawtypes")
public void exportReportList1(CommonReportHandler commonReportHandler)
throws AppException {
List lst = commonReportHandler.getDataSourceList();
List<Object> dataSourceList = null;
try {
if (lst != null && lst.size() > 0) {
dataSourceList = new ArrayList<Object>();
JRDataSource dataSource = null;
for (int i = 0; i < lst.size(); i++) {
List datalist = (List) lst.get(i);
if (datalist != null && datalist.size() > 0) {
dataSource = new JRBeanCollectionDataSource(datalist);// 獲取數據集
} else {
dataSource = new JREmptyDataSource();
}
dataSourceList.add(dataSource);// 組裝數據源集合
}
}
this.getRequest().setAttribute(ReportConstants.REPORT_FLAG, "1");
// 設置路徑
this.getRequest().setAttribute(
ReportConstants.REPORT_PATHLIST_SYMBOL,
commonReportHandler.getReportFiles());
// 獲取報表類型(表格 or 圖形)
this.getRequest().setAttribute("ReportType", "GraphicsReport");
// 報表輸出格式類型(PDF or EXCEL ,HTML)
this.getRequest().setAttribute(
ReportConstants.REPORT_OUT_FORMAT_SYMBOL,
commonReportHandler.getFormatType());
// 設置數據源LIST
this.getRequest().setAttribute(
ReportConstants.REPORT_DATASOURCELIST_SYMBOL,
dataSourceList);
// 設置MAP參數
this.getRequest().setAttribute(
ReportConstants.REPORT_PARAMETER_SYMBOL,
commonReportHandler.getParamMap());
this.getRequest()
.getRequestDispatcher("/JReportServlet")
.forward(ServletActionContext.getRequest(),
ServletActionContext.getResponse());
} catch (ServletException e) {
throw new AppException(e);
} catch (IOException e) {
throw new AppException(e);
}
}
