JSP 實現報表打印

iReport_web開發配置嚮導- -
                                      
一、iReport簡介

 說到iReport不得不先介紹Jasperreport,Jasperreport是一個報表製作程序,用戶需要按照它制定的規則編寫一個XML文件,然後得到用戶需要輸出的格式文件。它支持輸出的文件格式包括PDF,HTML,XML,XLS,CVS等等。而iReport就是一個製作Jasperreport的XML文件的可視化開發工具。只是一個UI。

二、安裝說明

 2.1 基本安裝
 現在最新的版本是iReport 0.5.1 (Aug 27, 2005).
 下載後解壓然後在根目錄雙擊iReport.bat就可以用了,但是爲了可以使用external ttf font還必須要把 iReport-0.5.1/fonts 加到環境變量裏面去。
 
 2.2 瞭解製作報表用的包
 下載後到到 iReport-0.5.1/lib 裏看看,你就可以發現iReport的真面目了。
 (1)  jasperreports-1.0.1.jar
 jasperreports是iReport的核心內容。它是一個強力的報表產生工具,他有能力描述豐富內容到屏幕上、到打印機或到PDF, HTML, XLS, CSV和XML文件。它完全用Java編寫的,並可在各種Java應用(包括J2EE或WEB應用)中用來產生動態內容。它的主要目的是以一種簡單而靈活的方式來幫助創建導向的頁面。
 JasperReports組織根據在一個XML文件中定義的報表設計通過JDBC來接受來自一個關係數據庫中的數據. 爲了以數據來填充報表,報表設計必須首先被編譯。
 jasperreports的官方網站:http://jasperreports.sourceforge.net/
(2) itext-1.3.1.jar
 iText是一個開放源碼的Java類庫,是用來生成PDF文件的。
 iText的官方網站:http://itext.sourceforge.net
 如果要在生成的pdf文件顯示中文等亞洲字符,還必須下載itext的亞洲字符包。
 tTextAsian的官方下載地址:http://itextdocs.lowagie.com/downloads/iTextAsian.jar
  
(3) jfreechart-1.0.0-rc1.jar
 jfreechart是一款免費的、功能強大的統計圖生成工具,可以直接生成PNG,JPG等各式的文件。
 這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分佈圖、混合圖、甘特圖以及一些儀表盤等等。
 jfreechart的官方下載地址:http://www.jfree.org/jfreechart/
   
(4) jcommon-1.0.0-rc1.jar
 JCommon是一組有用的classes集合.它已經用在JFreeChart,JFreeReport與其它項目上. 這個類庫包含了以下功能: 文本工具類(text utilities), 用來顯示關於應用程序信息的用戶界面類,佈局定製管理器,一個日期選擇面板,序列化工具類,XML解析器支持類.
 jcommon的官方下載地址:http://www.jfree.org/jcommon/
(5) poi-2.0-final-20040126.jar
 Apache的Jakata項目的POI子項目,目標是處理ole2對象。目前比較成熟的是HSSF接口,處理MS Excel(97-2002)對象。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。
 直接調用poi包的不是ireport,而是jasperreport。
 poi的官方下載地址:http://www.apache.org/dyn/closer.cgi/jakarta/poi/
 
 這些是用來製作報表用的包,所以可以用最新的版本來代替原有包。但是務必保持與項目中的包一致,因爲很多開源的項目都不向下兼容。(例如jasperreport)
 

三、製作jrxml、jasper

 3.1 選擇語言
 Tools->Option->General->Language
 3.2 連接數據庫
 資料來源->連結/資料來源
 如果要使用mysql以外的數據庫,要保證jdbc包在環境變量裏。放到iReport-0.5.1/lib 下也可以。name相當於一個JNDI。添好後點擊test按鈕如果顯示成功就可以執行下一步了。
 3.3 新建一個Report
 定位可以控制報表是橫向的還是縱向的。Portrait是縱向,Landscape是橫向。
 邊距是可以調整的。
 
 3.4 基本域
 title域用來放報表的總標題
 pageHeaher域顧名思義頁頭
 columnHeader域是用來放static text的,也就是不循環的部分。
 detail域是用來放text field的,也就是循環部分。
 pageFooter域是用來放本頁的統計參數的。
 summary域是用來放整個表的統計參數的。
 
 可以直接調整每個域的長度,也可以通過Band properties來調整。當然總長度是不會超過頁面的原長。
 
 3.5 報表查詢
 3.5.1 爲報表添加SQL查詢語句
 資料來源->報表查詢
 在Report SQL query裏填寫SQl語句。如果語句正確,在下面的field裏就會顯示正常的表字段。
 
 3.5.2 爲報表添加動態字段
 預覽->報表字段
 把fields裏的字段直接拖到報表上就行了。
 
 3.5.3 爲SQL語句添加參數
 預覽->報表參數
 在parameters裏新增一個參數
 paratemeter name 是參數名,在SQL語句裏寫成"$P{參數名}"
 paratemeter class type裏選擇參數類型。
 注意:如果是int型的數據,最好在報表字段裏將該字段的Class type改成java.lang.String型的。
 另外一種辦法,不管該字段原來是什麼數據類型,直接在paratemeter class type裏選擇java.lang.String類型,然後在Default value expression 填寫"Integer.toString(整數)"。
 
 3.5.4 添加報表變量
 預覽->報表變量 $V{變量名}
 
 3.5.5 處理字體
 3.5.5.1 基本設置
 選中字段->右鍵->properties->font(雙擊也可以)
 Report font 選擇全局的字體(僅限於該報表)
 Font name 選擇在ireport裏面顯示的字體
 Pdf font name 選擇在pdf裏面顯示的字體
 Rotation 選擇內容是否旋轉(很有用的選項)
 PDF Encoding 中文要用UniGB-UCS2-H,外部字體要選Identity-H
 
 3.5.5.2 選擇外部字體
 第一步 先在Pdf font name裏選擇External TTF font,然後在下面的Ture Type font裏選擇外部字體,當然要用的外部字體放在iReport-0.5.1/fonts目錄下面。
 第二步 在web項目的WEB-INF/classes/下面放要用到的外部字體,才能在程序里正常顯示。
 
 3.5.5.3 設定該報表的全局字體
 預覽->報表字型
 
 3.6 編譯jrxml
 建立->編譯
 編譯後生成一個後綴名爲jasper的binary文件,可以直接給程序調用。
 

四、web項目應用
 4.1 jsp輸出PDF報表
 
 4.1.1 需要放到項目裏的包
 itext-1.3.1.jar
 iTextAsian.jar
 jasperreports-1.0.1.jar
 
 4.1.2 輸出PDF注意事項:
 
 4.1.3 jsp輸出PDF的例子
 
 <%@ page import="java.sql.*" %>
 <%@ page import="java.util.*" %>
 <%@ page import="java.io.*" %>
 <%@ page import="net.sf.jasperreports.engine.JasperFillManager" %>
 <%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
 <%@ page import="net.sf.jasperreports.engine.JRException"%>
 <%@ page import="net.sf.jasperreports.engine.JasperRunManager"%>//pdf
 
 <%
  String rowid = "1";//初始化變量
  
  Connection conn= DriverManager.getConnection("proxool.test");//從數據源連接數據庫
  
  //裝載jasper文件application
  File exe_rpt = new File(application.getRealPath("/reports/test.jasper"));
  
  //rowid就是iReport的變量$P{rowid}的名稱
  Map parameters = new HashMap();
  parameters.put("rowid",rowid);
 
  try{
   // fill
   JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
   
   // 生成pdf
   byte[] bytes = JasperRunManager.runReportToPdf(exe_rpt.getPath(),parameters,conn);
  
   response.setContentType("application/pdf");
   response.setContentLength(bytes.length);
   ServletOutputStream ouputStream = response.getOutputStream();
   ouputStream.write(bytes,0,bytes.length);
   ouputStream.flush();
   ouputStream.close();
   
   conn.close();
   }catch(JRException ex){
   out.print("Jasper Output Error:"+ex.getMessage());
  }
 %>
 
 4.2 jsp輸出EXCEL報表
 
 4.2.1 需要放到項目裏的包
 jasperreports-1.0.1.jar
 poi-2.0-final-20040126.jar
 
 4.2.2 輸出excel要注意的:
 (1) 輸出excel報表必須fields的邊界剛好填充滿整個頁面,不然會有大量的空白出現。
 (2) 刪除記錄最下面的空行需要加上參數
 exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);
 (3) 刪除多餘的ColumnHeader需要加上參數
 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);
 (4) 在ireport裏給fields加上border,那輸出的excel就會有很黑的邊框,跟excel默認的灰度邊框就會很不協調。但是如果不加border,在輸出的excel裏就不會顯示每個表格的邊框。
 解決方法是:
 第一步 在選中字段->右鍵->properties->Common->Transparent 打上勾。
 第二步 在輸出的jsp頁面加上參數
 exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);
 
 4.2.3 jsp輸出EXCEL的例子
 <%@ page import="java.sql.*" %>
 <%@ page import="java.util.*" %>
 <%@ page import="java.io.*" %>
 <%@ page import="net.sf.jasperreports.engine.JasperFillManager" %>
 <%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
 <%@ page import="net.sf.jasperreports.engine.JRException"%>
 <%@ page import="net.sf.jasperreports.engine.JRExporterParameter"%>//excel
 <%@ page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%>//excel
 <%@ page import="net.sf.jasperreports.engine.export.JRXlsExporter"%>//excel
 
 <%
  String rowid = "1";
  Connection conn= DriverManager.getConnection("proxool.test");
 
  //裝載jasper文件application
  File exe_rpt = new File(application.getRealPath("/excel/test_excel.jasper"));
  
  //rowid就是iReport的變量$P{rowid}的名稱
  Map parameters = new HashMap();
  parameters.put("rowid",rowid);
  
  try{
 
   // fill
   JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
   
   // excel輸出
   ByteArrayOutputStream oStream = new ByteArrayOutputStream();
  
    JRXlsExporter exporter = new JRXlsExporter(); 
   
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream);
    exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); // 刪除記錄最下面的空行
    exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);// 刪除多餘的ColumnHeader
    exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);// 顯示邊框
    exporter.exportReport();
   
   byte[] bytes = oStream.toByteArray();
   
   if(bytes != null && bytes.length > 0) {
    response.reset();
    response.setContentType("application/vnd.ms-excel");
     response.setContentLength(bytes.length);
    ServletOutputStream ouputStream = response.getOutputStream();
    ouputStream.write(bytes,0,bytes.length);
    ouputStream.flush();
    ouputStream.close();
  
   }else{
    out.print("bytes were null!");
   }
   
   conn.close();
   }catch(JRException ex){
   out.print("Jasper Output Error:"+ex.getMessage());
  }
 
 %>
 
 4.3 jsp輸出html報表
 沒有意義,不寫。
五、備註

 5.1 下載地址
 iReport的官方網站:http://ireport.sourceforge.net/
 jasperreports的官方網站:http://jasperreports.sourceforge.net/
 tTextAsian的官方下載地址:http://itextdocs.lowagie.com/downloads/iTextAsian.jar
 jfreechart的官方下載地址:http://www.jfree.org/jfreechart/
 jcommon的官方下載地址:http://www.jfree.org/jcommon/
 poi的官方下載地址:http://www.apache.org/dyn/closer.cgi/jakarta/poi/
AUTHOR:  JOMPER    2005.10.22
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章