在我們對VS.Net中的水晶報表(Crystal Reports)進行研究之前,我和我朋友對如何將這個復雜的東東加入我們的Web應用有著非常的好奇心。一周以後,在閱讀了大量的“HOWTO”文檔之後,我們成功地將一些簡單的報告加入到了我們的ASP.Net程序中,並得到了一些小決竅。
這篇文章教你如何在.Net Web應用中使用水晶報表,也可以讓你在學習過程中少走一些彎路。為了得到最好的效果,讀者最好需要有一些基礎的ASP.Net訪問數據庫的知識以及使用VS.Net的開發經驗。
簡介
水晶報表可以由很多的方法得到,其中一個就是使用VS.Net來創建,它提供了非常豐富模型以使我們能夠在運行時操作屬性和方法。如果你正在使用VS.Net開發.Net程序,那麼你就不需要再安裝其它軟件了,因為他已經內嵌在VS.Net中了。
優點:
VS.Net水晶報表有下面一些主要的優點:
快速的報表開發
能夠導出成為復雜的交互性圖表
可以與其它控件一起在WebForm中使用
能夠動態地將報表導出成為.pdf,.doc,xls,Html,rtf等多種格式
結構:
一些組件組成了水晶報表的二層結構,需要的Web應用有:
客戶端 :
客戶端僅需要一個可以訪問嵌入ASPx頁面報表的游覽器就可以了
服務器 :
水晶報表引擎(Crystal Report Engine (CREngine.dll))
通過它可以完成一些任務,如在報告文件中合並數據,轉換報告為其它格式等。也正是因為報告引擎的作用,才可以將ASP.Net中的水晶報表轉換成為普通Html格式
水晶報表設計器(Crystal Report Designer (CRDesigner.dll))
水晶報表就是在設計器中創建的,在設計器中你可以設計標題,插入數據,公式,圖表,子報表等。
.rpt報表文件
執行報表中的第一步就是在水晶報表設計器接口創建此報表,在默認安裝中微軟已經提供了一些現成的.rpt例子。
Data Source
.rpt文件取得數據庫的方法取決於你方法的選擇,你能選擇讓水晶報表自己選擇數據而不使用任何代碼或者也可以選擇手動的組裝DataSet,然後再將其傳送到報表文件。
水晶報表查看控件(Crystal Report Viewer web form Control (CRWebFormVIEwer.dll))
水晶報表查看控件是一個WebForm控件,可以將它看成是一個在.ASPx頁面中存放報表的容器。 注意:在一些復雜的操作中,報表服務器與Web服務器可能不在同一物理主機上,Web服務器將HTTP請求傳送到報表服務器上去。水晶報表也可以當做WebService來執行。
執行模式
水晶報表取數據可以使用下面的方法實現:
Pull 模式:
被請求時,水晶報表直接根據指定的驅動連接數據庫然後組裝這些數據。
Push 模式 :
此時開發表不得不自己編寫代碼連接數據並組裝DataSet,同時將它傳送至報表。在些這種情況下,通過使用連接共享以及限制記錄集合的大小,可以使用報表性能最大化。
報表類型:
水晶報表設計器能夠直接包含報表至工程也能夠使用獨立的報表對象。
Strongly-typed 報表 :
當你將報表文件加入到項目中去時,它就變成了一個了“ strongly-typed“報表。在這些情況下,你將擁有直接創建報表的對象的權力,這將減少一些代碼並且能夠提供一些性能。
Un-Typed 報表 :
這裡的報表並不直接包含在項目中,因此稱為‘un-typed’ 報表。在這種情況下,你不得不使用水晶報表的”ReportDocuemt“對象建立一個實例,並且”手動“地凋用報表。
其它注意事項
盡管水晶報表查看器擁有一些很酷的功能,如縮放、頁面導航等。但是他不提供打印功能,你不得不調用游覽器的打印功能。
VS.Net中的水晶報表如果沒有注冊,那麼它只能使用30次,30次後,”保存“功能就不能再使用了。為了避免這個,你不是不在 http://www.crystaldecisions.com/這裡注冊此產品。 (好像不是這樣子的,不注冊也好像能用很長的時間,只是不能提供支持)
默認安裝的水晶報表只能支持5個用戶,為了支持更多的用戶,你不得不在http://www.crystaldecisions.com/中購買許可證。
讓我們感受一下----在ASP.Net中使用一個現成的水晶報表文件
讓我們先感受一下在WebForm中使用水晶報表的感覺。
1) 從WebForm工具欄中拖動水晶報表查看器控件(Crystal Report VIEwer)至.ASPx頁面中。
2) 調出水晶報表查看器控件的屬性窗口
3) 點擊[...]按鈕查看"Data Binding"屬性,並彈出了DataBinding窗口。
4) 從左邊的"Bindable屬性”區中選擇“Report Source”
5) 選中"自定義綁定表達式"單選按鈕,在右邊的底部的窗口中指定.rpt文件的文件名和路徑,例如:"C:\\Program Files\\Microsoft Visual Studio.Net\\Crystal Reports\\Samples\\Reports\\General Business\\World Sales Report.rpt",然後”確定“
注意:文件”World Sales Report.rpt“文件是在VS.Net安裝時創建的。如果你在安裝過程中指定了其它目錄,此時你最好確認一下路徑的正確性。
上面的步驟中實際上是插入了下面這些代碼至ASP.Net文件中: <%@ Register TagPrefix="cr" Namespace="CrystalDecisions.Web" Assembly="CrystalDecisions.Web" %>
以及: <CR:CRYSTALREPORTVIEWER>
id="CrystalReportVIEwer1"
runat="server" Width="350px" Height="50px"
ReportSource=' <%# "C:\\Program Files\\Microsoft Visual Studio.Net\\Crystal Reports\\Samples\\Reports\\General Business\\World Sales Report.rpt" %>'>
</CR:CRYSTALREPORTVIEWER>
注意:在飛刀我的VS.Net正式版中自動生成的代碼中ReportSource產生的樣式不是這樣子的,它是: ReportSource=" <%# C:\xxxxx\xxx.rpt %>"
這樣是錯誤的,會出現錯誤信息,有兩處錯誤:
DataBind中要有雙引號,因此外部只能用單引號
目錄分隔符號不能使用"\",必須使用"\\"
必須按照使用本文介紹的格式來手動修改,這也算是VS.Net的一個Bug吧。
6) 在Page_Load方法中調用DataBind方法。(代碼為VB.Net)
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
DataBind()
End Sub
7)保存並編譯你的頁面。 現在,你就有一個內嵌水晶報表的WebForm頁面了。
注意:實際開發中,一開始會出現無法訪問inetsrv目錄的錯誤,解決的辦法是改變其目錄的安全屬性,使User用戶有可寫的權限。飛刀我發現.Net系統自已給出的解決方法是沒有用的,也可能是我使用的是Windows.Net操作系統的原因。