打印信息,通過.jasper工具將集合輸出到PDF文件 然后利用打印機打印文件


我們上一次成功的利用iReport工具制作了一張報表,並且預覽了報表最后的效果,也生成了格式為“jrpxml”、“jrxml”與“jasper”的文件。這次,我們使用jasper提供的java的api去利用在iReport中制作的報表jasper文件來生成真正的報表文件。

本文以生成pdf格式的報表文件為例,該報表文件包含所有男用戶的信息。

首先我們打開MyEclipse,在其中創建一個java工程:

新建一個lib文件夾,然后在lib中加入我們准備好的jar包:

然后將這些jar包全部添加到環境中(右鍵build path)


然后編寫獲取數據庫連接的類,用於連接數據庫並獲取相應連接對象,以便於后期操作數據庫:

[java]  view plain  copy
 
  1. package com.cn.org.ireport.test;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5.   
  6. public class JDBCConnection {  
  7.       
  8.     public static Connection getConnection(){  
  9.         try {  
  10.              String url = "jdbc:mysql://localhost:3306/db_film";  
  11.              Class.forName("org.gjt.mm.mysql.Driver");  
  12.              Connection con = DriverManager.getConnection(url, "root", "1234");  
  13.              return con;  
  14.          }catch(Exception e){  
  15.               e. printStackTrace();  
  16.          }  
  17.          return null;  
  18.     }  
  19. }  


接下來編寫dataSource類(也就是數據填充類),實現JRDataSource接口,通過放在list里面的Map對象迭代實現數據對應:

[java]  view plain  copy
 
  1. package com.cn.org.ireport.test;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import net.sf.jasperreports.engine.JRDataSource;  
  9. import net.sf.jasperreports.engine.JRException;  
  10. import net.sf.jasperreports.engine.JRField;  
  11. /** 
  12. *  dataSource類(也就是數據填充類),實現JRDataSource接口 
  13. *  通過放在list里面的Map對象迭代,實現數據對應 
  14. */  
  15. public class ReportDataSource implements JRDataSource{  
  16.   
  17.     private Iterator iter;  
  18.       
  19.     //創建一個,map對象用與數據對應  
  20.     Map map = new HashMap();  
  21.       
  22.     //無參的構造函數  
  23.     public ReportDataSource(){  
  24.           
  25.     }  
  26.       
  27.     //以sex為參數的有參構造函數,用於數據初始化  
  28.     public ReportDataSource(String sex){  
  29.         //通過性別獲取相應用戶的數據  
  30.         List datas=DateSourceBaseFactory.createBeanCollection(sex);  
  31.         //要將List中的數據迭代,需要使用Iterator迭代對象  
  32.         iter=datas.iterator();  
  33.     }  
  34.       
  35.     //通過key獲取value值  
  36.     public Object getFieldValue(JRField arg0) throws JRException {  
  37.         return map.get(arg0.getName());  
  38.     }  
  39.   
  40.     //接口JRDataSource的方法,判斷是否有下一個數據  
  41.     public boolean next() throws JRException {  
  42.         if(iter.hasNext()){  
  43.             map=(Map)iter.next();  
  44.             return true;  
  45.         }  
  46.         return false;  
  47.     }  
  48.   
  49. }  


接下來實現上個類中的DateSourceBaseFactory(提供數據的數據源工廠),它是實際從數據庫中取出相應數據,然后將其封裝在map中,然后又將相應的map裝在List容器中。

[java]  view plain  copy
 
  1. package com.cn.org.ireport.test;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.ResultSet;  
  5. import java.sql.SQLException;  
  6. import java.sql.Statement;  
  7. import java.util.ArrayList;  
  8. import java.util.HashMap;  
  9. import java.util.List;  
  10. import java.util.Map;  
  11. /** 
  12.  * Map中的鍵值要與模板中的file值對應 
  13.  * */  
  14. public class DateSourceBaseFactory {  
  15.   
  16.     public static List createBeanCollection(String sex) {  
  17.           
  18.         int num=0;  
  19.         if(sex.equals("男")){  
  20.             num=1;  
  21.         }else{  
  22.             num=2;  
  23.         }  
  24.           
  25.         ResultSet rs=null;  
  26.         Statement st=null;  
  27.         Connection con=null;  
  28.         List datas=new ArrayList();  
  29.           
  30.         try {  
  31.             con=JDBCConnection.getConnection();  
  32.             st=con.createStatement();  
  33.             rs=st.executeQuery("select name,brithday,province,Email from user where sex="+num);  
  34.             while(rs.next()){  
  35.                 Map attris=new HashMap();  
  36.                 attris.put("name", rs.getString("name"));  
  37.                 attris.put("brithday", rs.getString("brithday"));  
  38.                 attris.put("province", rs.getString("province"));  
  39.                 attris.put("Email", rs.getString("Email"));  
  40.                 datas.add(attris);  
  41.             }  
  42.         } catch (Exception e) {  
  43.             e.printStackTrace();  
  44.         }finally{  
  45.                 try {  
  46.                     if(rs!=null) rs.close();  
  47.                     if(st!=null) st.close();  
  48.                     if(con!=null) con.close();  
  49.                 } catch (SQLException e) {  
  50.                     e.printStackTrace();  
  51.                 }  
  52.         }  
  53.           
  54.         return datas;  
  55.     }  
  56.   
  57. }  


接下來編寫dataSource的javaBean類。用於創建模板

[java]  view plain  copy
 
  1. package com.cn.org.ireport.test;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class DataSoruceBean implements Serializable{  
  6.   
  7.     private static final long serialVersionUID = 1L;  
  8.       
  9.     private String name;  
  10.     private String brithday;  
  11.     private String province;  
  12.     private String Email;  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public String getBrithday() {  
  20.         return brithday;  
  21.     }  
  22.     public void setBrithday(String brithday) {  
  23.         this.brithday = brithday;  
  24.     }  
  25.     public String getProvince() {  
  26.         return province;  
  27.     }  
  28.     public void setProvince(String province) {  
  29.         this.province = province;  
  30.     }  
  31.     public String getEmail() {  
  32.         return this.Email;  
  33.     }  
  34.     public void setEmail(String email) {  
  35.         this.Email = email;  
  36.     }  
  37. }  


接下來是重頭戲,編寫測試入口類,生成pdf文件。JasperFillManager中有多個生成文件的方法
,除了可以生成pdf文件外還可以生成ofice文檔文件。這里我們就將取出的數據打印到報表中去:

[java]  view plain  copy
 
  1. package com.cn.org.ireport.test;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.File;  
  5. import java.io.FileOutputStream;  
  6. import java.util.HashMap;  
  7. import java.util.Map;  
  8.   
  9. import net.sf.jasperreports.engine.JRAbstractExporter;  
  10. import net.sf.jasperreports.engine.JRException;  
  11. import net.sf.jasperreports.engine.JRExporterParameter;  
  12. import net.sf.jasperreports.engine.JasperFillManager;  
  13. import net.sf.jasperreports.engine.JasperPrint;  
  14. import net.sf.jasperreports.engine.export.JRPdfExporter;  
  15. import net.sf.jasperreports.engine.export.JRPdfExporterParameter;  
  16.   
  17. public class TestReportHere {  
  18.     public static void main(String[] args) {  
  19.         Map parameters=new HashMap();  
  20.         ByteArrayOutputStream outPut=new ByteArrayOutputStream();  
  21.         FileOutputStream outputStream=null;  
  22.         File file=new File("F:/Temp/report.pdf");  
  23.         String reportModelFile="C:/Users/jack/report2.jasper";  
  24.           
  25.         try {  
  26.             JasperPrint jasperPrint=JasperFillManager.fillReport(reportModelFile,  
  27.                     parameters,new ReportDataSource("男"));  
  28.             JRAbstractExporter exporter=new JRPdfExporter();  
  29.             //創建jasperPrint  
  30.             exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);  
  31.             //生成輸出流  
  32.             exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outPut);  
  33.             //屏蔽copy功能  
  34.             exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED,Boolean.TRUE);  
  35.             //加密  
  36.             exporter.setParameter(JRPdfExporterParameter.IS_128_BIT_KEY,Boolean.TRUE);  
  37.             exporter.exportReport();  
  38.             outputStream=new FileOutputStream(file);  
  39.             outputStream.write(outPut.toByteArray());  
  40.         } catch (JRException e) {  
  41.             e.printStackTrace();  
  42.         }catch (Exception e) {  
  43.             e.printStackTrace();  
  44.         }finally{  
  45.             try {  
  46.                 outPut.flush();  
  47.                 outPut.close();  
  48.             } catch (Exception e) {  
  49.                 e.printStackTrace();  
  50.             }  
  51.         }  
  52.     }  
  53. }  


我們點擊右鍵“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);
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM