JasperReports與iReport 簡介

簡介 JasperReports是一款開源的報表打印組件,是開源代碼組織sf.net中的一個java報表打印工程,可以以PDF, HTML或XML等多種形式產生報表,支持分頁打印,並且可以製作各種類型的圖表。Jasperreport是按照一個預定義的xml文檔來組織報表的數據,這些數據來源多樣,包括關係數據庫(通過配置JDBC連接)、java容器對象(collection和arrays)。要完成報表的填充,必須先完成用於報表的xml文件,其過程是先產生報表設計對象,再序列化該對象,存儲在磁盤或者網絡,用於產生特定應用的表格數據。事實上,表單的設計過程就是用定義於xml文件中的java表達式來表現報表的設計。編輯過程中會有各種保證數據一致性的驗證,最終會產生相關數據文檔或填充數據的準備。 iReport也是開源組織sf.net中的一款免費軟件,其主要作用是以可視化的方式升級生成JasperReport所使用的報表格式文件,因爲JasperReport本身沒有提供很好的可視化報表設計工具,iReport正好彌補了這個缺陷,因此我們常常將這兩個工具結合起來使用。 JasperReports可以在這個地址得到: http://jasperreports.sourceforge.net/ iReport 可以在這個地址得到: http://ireport.sourceforge.net/ iReport的使用 iReport的安裝 安裝iReport首先需要在本機安裝JDK,並對環境進行配置,最新版的JDK可以從http://www.sun.com 處下載並安裝,然後配置windows環境變量,在path後面加入“;java的安裝目錄”,新建環境變量 JAVA_HOME :“java的安裝目錄” CLASSPATH:“java的安裝目錄/bin” 如果已經安裝過JDK,則可以跳過這些步驟。然後從iReport的站點下載最新的版本的iReport,解壓iReport在任意目錄,解壓後的文件裏面有一個iReport.bat,通過雙擊,過大約30秒鐘如果可以彈出iReport的主窗體即表明你的系統已經可以運行iReport了,如果不能彈出主窗體,一般是因爲JDK沒有正確被安裝。在iReport中配置數據庫使用iReport的第一步是配置數據庫連接,選擇菜單“資料來源/連接資料來源”,打開如下的對話框, 點擊“New”,打開如下對話框,可以創建數據連接, 我們以創建JDBC數據源爲例,在“Type of connection / datasource”列表中,選擇“Database.JDBC.connection”,在“Name”中,爲創建的新的連接取一個需要的名字,在JDBC Driver中,選擇一個驅動,我們以Oracle爲例,選擇“oracle.jdbc.driver.OracleDriver”,在JDBC URL中輸入JDBC連接,例如:“jdbc:oracle:thin:@localhost:1521:TANGO”,同時請在Username和Password中輸入連接數據庫的用戶和密碼。注意一點OracleJDBC的包必須在環境變量的CLASS_PATH中配置。全都創建好後,點擊“Test”可以進行對數據庫連接的測試。建立連接後,就可以對數據表進行查詢,選擇菜單“資料來源/報表查詢”,打開如下對話框: 在“Report SQL query”頁中,可以輸入任意的sql數據來得到數據,當輸完完整的sql語句後,iReport自動將所有字段列表列出,這些字段就是可以在報表製作過程中可以使用的變量。另外需要注意的是:當我們創建了多個數據源的時候,需要設定一個當前的數據源,選擇菜單:“設定/設置當前數據源”,打開如下對話框: 可以在所有建立的數據源中設置當前使用的數據源。從java容器獲得數據通過JDBC獲得數據非常方便,但我們通常不會在設計期就確定完整的sql語句,通常我們在運行期都需要構造一些動態的sql,當然,我們可以通過編程的方式來構造sql並傳遞給iReport,但是複雜的sql語句不便於維護,也容易出錯。JasperReports允許從java容器中獲得數據,首先告訴iReport,java容器類的路徑,選擇菜單:“工具/classpath”,如圖: 設置完路徑後,再次選擇菜單“資料來源/報表查詢”,到“JavaBean Datasource”頁,在Class Name中輸入容器類的全路徑,如下圖: 點擊“Read javabeans attributes”,容器中的字段就全部被讀取了出來。至此爲止,我們已經可以開始製作報表了。開始使用iReport iReport的開發界面和我們熟悉的delphi著名插件quickreport比較相似,整個頁面由若干個band組成,每個band實現不同的顯示方式。界面如下: 新建報表單擊工具欄的第一個按鈕“New Report”,或者通過菜單“報表/新增”進入創建報表菜單,如下圖: 在報表名稱欄內給創建的報表取個名字,然後是定義紙張的大小,iReport提供了多種預設尺寸,當然也可以選擇自定義的頁面尺寸,並提供兩種定位方式,也即橫向和豎向。在對話框的下半頁,還可以設置頁邊距,列等等。當都設置完成,點擊“OK”,完成新建動作。報表結構創建了一個新的報表後,我們來看看報表的結構。一個報表的結構大致是幾個部分:title、pageHeader、columnHeader、detial、columnFooter、pageFooter、summary、groupHeader、groupfooter。 Title:每個報表一般會有一個名字,比如×××銷售報表,title就是擱置這個名稱的最好地方了,當然你也可以根據需要擱置在合適的地方。 pageHeader:報表的一些公共要素,比如頁碼、創建時間、創建人等信息放置在這裏是比較好的選擇。在每頁頭都會打印一遍 columnHeader:這裏是放置列的名稱,記住不是列數據。 Detial:放置需要循環的數據,比如銷售記錄數據。 columnFooter:放置列級別的統計計算值或是列的說明。 pageFooter:放置頁級別的統計值或是頁的說明。 Summary:可能需要對幾頁(你的報表可能有幾個頁組成)的統計值。比如50個銷售記錄共佔用了3頁,那麼放置這些統計記錄的統計值最好的地方就是summary。 groupHeader:每個表的內容可能需要根據某個屬性進行劃分顯示內容和計算內容,比如希望以月份爲單位每組分開顯示銷售記錄,那麼就可以定義一個組(組的定義參考後文),groupHeader就是放置組說明或是組標誌最好的地方。 Groupfooter:放置組的統計或是說明。報表的動態對象變量、參數、字段在使用iReport的過程中會碰到很多與變量(Variables)、參數(Parameters)、字段(Fields)這些有關的內容,所以我們還是要先介紹這些對象的使用和意義:字段(Fields):來自數據庫,或是java容器對象。這些內容是報表顯示的主體內容,語法爲$F{ filedsName }。參數(Parameters):這是你的應用需要提供給報表的入口,比如你希望在報表被解釋的時候提供Where語句的條件值,那麼就可以使用參數(Parameters)。語法爲$P{ parameterName },可以給報表提供多個參數,通過一個HashMap傳入。使用參數前,參數必須在iReport中進行配置,如,我們需要在打印時得到打印操作人,我們創建一個參數打印人:printOperator。選擇菜單“預覽——報表參數”,打開如下對話框: 在參數頁面,點擊“新增”按鈕,繼續打開如下新增參數對話框: 在“Parameter name”內,填入參數名稱:“printOperator”,在“Paramenter class type”選擇框中,選擇參數的類型,我們這裏選擇“java.lang.String”,在“Default value expression”中填入當傳入的值缺失時的缺省值,因爲iReport是純java語言開發,因此支持任何java語句。在“Paramenter description”中可以對該參數進行一些描述。點擊“OK”完成參數的創建。下面給出簡單的程序調用實例: HashMap map = new HashMap(); Map.put(“printOperator”,”陳寧”); JasperFillManager.fillReport(jasperReport,map,ds); 變量(Variables):這是報表中一些邏輯運算的表現,比如統計值(求和,最大值,最小值等等)。語法爲$V{ variablesName },例如我們要對定單金額進行求和,假設定單金額的數據庫字段爲amt,我們現在創建變量名爲totalAmt的對定單金額進行彙總的變量,點擊菜單“預覽/報表變量”,打開如下對話框: 我們看到iReport已經爲我們預先定義了五個有用的變量,供我們使用,具體含義如下: • $V{REPORT_COUNT}: 報表處理的記錄筆數 • $V{PAGE_NUMBER}: 打印時的頁碼 • $V{PAGE_COUNT}: 本頁處理的記錄筆數 • $V{COLUMN_NUMBER}: 報表的直欄數目 • $V{COLUMN_COUNT}: 本欄的處理筆數 • $V{羣組名_COUNT}: 羣組Band的處理筆數,建立羣組時會自動產生的變量其中最後一個變量是根據分組情況自動生成的。我們現在新增一個自己定義的變量,點擊“新增”,打開新增變量對話框: 在“Variable name”中,輸入變量名:“totalAmt”,在“variable class type”中選擇變量的類型“java.math.BigDecimal”,在“Calculation type”中選擇計算的類型,這裏是求和“Sum”,在“Variable expression”中輸入變量的表達式,我們這裏是取數據庫中的字段amt,所以寫成“$F{amt}”,請注意。當我們正確的配置了數據來源後,當我們輸入的表達式正確,那麼顯示的顏色是綠色的的,當不能正確寫對表達式的時候,是如圖所示的藍色。然後我們在“initial value expression”中輸入初始化的值,這裏同樣輸入java語句:“new java.math.BigDecimal(0)”。點擊“OK”,完成參數的設置。在報表頁面放置元素 iReport的工具欄提供了豐富的元素,從簡單的內容到包括圖形,分組報表都支持。我們主要介紹兩類,一類爲靜態文本,一類爲動態文本。這兩個工具按鈕如下: 點擊“T”的工具按鈕,打開添加“靜態文本”的對話框。 他的用法比較簡單,有一些計算機使用經驗的人都能看懂,就不在這裏介紹了。這裏只說一點:要顯示的內容是在Static Text頁面中輸入,在Print when expression中,可以接受返回類型爲Boolean的java表達式,當返回Boolean.TRUE,纔會打印該靜態文本,當返回爲Boolean.FALSE則不打印,在本文後面會介紹利用這個特性打印黑白交替的行顯示效果。我們再看看動態文本,點擊“F”,打開如下對話框: 動態與靜態文本大致類似,動態文本在“Text Field”中接受表達式,在“Textfield expression”中,輸入動態表達式“$F{s_data_1}”,如圖,綠色代表輸入正確。在Pattern中,還可以輸入數據顯示的格式。製作報表有了上面的基本知識,我們就可以開始製作報表了。我在製作報表中,考慮了以下的思路。首先,取數據通過java容器,而不是直接連接數據庫,這是因爲我們製作的報表通常都比較複雜,很難直接通過一個簡單的sql語句來實現,就算我們可以寫一個複雜的select語句來實現一個報表的查詢,但是對於以後的維護和排錯也是相當困難的,因此不建議這樣的做法。從另一個角度考慮,報表的很多查詢條件是根據用戶的輸入來動態的創建的,我們在後臺對數據進行整理和加工都會使程序的調試和實現變得簡單。我創建了數據容器類:ReportBaseObject,非常簡單,部分代碼如下: public class ReportBaseObject { private String s_data_1; private String s_data_2; private String s_data_3; …… private String s_data_20; private BigDecimal b_data_1; private BigDecimal b_data_2; private BigDecimal b_data_3; …… private BigDecimal b_data_20; private Date d_data_1; private Date d_data_2; private Date d_data_3; …… private Date d_data_10; private Integer i_data_1; …… private Integer i_data_10; public BigDecimal getB_data_1() { return b_data_1; } public void setB_data_1(BigDecimal b_data_1) { this.b_data_1 = b_data_1; } …… public Date getD_data_1() { return d_data_1; } public void setD_data_1(Date d_data_1) { this.d_data_1 = d_data_1; } …… public Integer getI_data_1() { return i_data_1; } public void setI_data_1(Integer i_data_1) { this.i_data_1 = i_data_1; } …… public String getS_data_1() { return s_data_1; } public void setS_data_1(String s_data_1) { this.s_data_1 = s_data_1; } …… } 這是一個通用的數據容器,容器中定義了20個字符類型的字段,20個數字類型的字段,10個日期和10個整型,這個容器對於任何報表都適合,這樣做是基於以下考慮。我把報表製作分爲兩個部分,第一部分是用iReport製作報表界面,第二部分在後臺根據用戶傳入條件取得報表需要的數據。而第一部分可以由項目人員在現場製作後後期進行修改,而第二部分由開發人員完成,因此要求這兩部分的工作可以分離,通過提供一個通用對象,我們可以實現這一目的。工程人員在現場和客戶洽談需求,並在沒有數據的情況下,開始製作報表界面,他們所要做的就是用一張表格列出他們需要的數據的含義:如: baseObject 對應字段 說明 報表編號:01_001 S_data_1 單號 S_data_2 單據類型 D_data_1 要貨日期 D_data_2 批准時間 B_data_1 應付金額 B_data_2 已付金額 在與用戶確認了界面後,工程人員將表格傳遞給開發人員,開發人員就根據表格所標註的字段意義給容器填寫數據。以下是我畫的報表截圖: 顯示不同的背景如下圖所示,我們希望打印出灰白相間的行效果,可以利用上文提到的“print when expresssion”屬性來實現,具體做法有兩種: 在同一列上放相同字段的TextField,一個不設背景(預設爲白色),另一個設背景(淡黃色) 白色背景的Print when expression輸入new Boolean((($V{PAGE_COUNT}.intValue()) % 2)==0) 灰色背景的Print when expression輸入new Boolean((($V{PAGE_COUNT}.intValue()) % 2)==1) 另一個方法是先在Detail Band上拉一個矩形,設其背景爲淡黃色,設其Print when expression爲new Boolean((($V{PAGE_COUNT}.intValue()) % 2)==1),意即奇數列時纔要印出這個淡黃底色的矩形。再設其前景爲白色,使矩形邊界的黑框消失。在矩形上放需要的Text Field,並將其Transparent打勾,意即此Text field是透明的。



調用IE內置打印組件完成web打印方案及例程
重點:
<OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0 VIEWASTEXT>
</OBJECT>
<input type=button value=打印 οnclick="document.all.WebBrowser.ExecWB(6,1)" class="NOPRINT">
<input type=button value=直接打印 οnclick="document.all.WebBrowser.ExecWB(6,6)" class="NOPRINT">
<input type=button value=頁面設置 οnclick="document.all.WebBrowser.ExecWB(8,1)" class="NOPRINT">
<input type=button value=打印預覽 οnclick="document.all.WebBrowser.ExecWB(7,1)" class="NOPRINT">

注意:
1、CSS對打印的控制:
<!--media=print 這個屬性可以在打印時有效-->
<style media=print>
.Noprint{display:none;}
.PageNext{page-break-after: always;}
</style>

Noprint樣式可以使頁面上的打印按鈕等不出現在打印頁面上,這一點非常重要,因爲它可以用最少的代碼完成最需要的功能

PageNext樣式可以設置分頁,在需要分頁的地方<div class="PageNext"></div>就OK了,呵呵

2、表格線粗細的設置,更是通過樣式表:

<style>
.tdp
{
border-bottom: 1 solid #000000;
border-left: 1 solid #000000;
border-right: 0 solid #ffffff;
border-top: 0 solid #ffffff;
}
.tabp
{
border-color: #000000;

border-collapse:collapse;
}
</style>

或者:

<style>
.TdCs1 {
border:solid windowtext 1.0pt;
}
.TdCs2 {
border:solid windowtext 1.0pt; border-left:none;
}
.TdCs3 {
border-top:none;
border-left:solid windowtext 1.0pt;
border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;
}
.TdCs4 {
border-top:none;
border-left:none;
border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;
}
.underline {
border-top-style: none;
border-right-style: none;
border-bottom-style: solid;
border-left-style: none;
border-bottom-color: #000000;
}
</style>



很多種打印的方式了,你走走腦子上網艘艘,沒有找不到的
給你個打印excel例子,跟上面的不同
下載一個叫jcom的lib,鬼子做的
把包裏的jcom.jar放到classpath,把jcom.dll放到java_home/bin下面
public class JCOM {

public boolean print(String fname) {
ReleaseManager rm = new ReleaseManager();
try {
ExcelApplication excel = new ExcelApplication(rm);

ExcelWorkbooks xlBooks = excel.Workbooks();
ExcelWorkbook xlBook = xlBooks.Open(fname);
ExcelWorksheet xlSheet = excel.ActiveSheet();

xlSheet.PrintOut();

xlBook.Close(false, null, false);
excel.Quit();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
rm.release();
}
return true;
}

public static void main(String[] args) {
JCOM test = new JCOM();

try {
test.print("c://test.xls");
} catch (Exception e) {
e.printStackTrace();
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章