使用水晶報表的強大功能來實現應用程式的統計分析及列印匯出等功能,是微軟平台上進行.NET應用程式開發報表的一種不錯的選擇。水晶報表在設計、開發、配置以及部署上,還是會給初學者帶來一定的困擾的。那麼,是否存在一種相對比較簡單而且易用的方式來進行水晶報表的設計、開發、配置以及部署呢?本文將提供一種比較簡單且相對靈活的方法。
本文將包含以下內容:
- Crystal Reports的另類非對象模式資料繫結
- 水晶報表的簡單模式部署
P.S. 本文中描述到的Crystal Reports為Crystal Reports for Visual Studio .NET,原則上該版本是runtime free授權,for unlimited user的。VS IDE版本為2008,Crystal Reports版本為10
- Crystal Reports的另類非對象模式資料繫結
水晶報表綁定資料的模式有很多種,其中包括使用DataSet、DataReader及ObjectCollection等。在某個特定的系統項目中,我們多數通過指定的業務資料庫來提供對報表資料的支援。本文將主要描述一種非資料庫資料繫結的變通模式,通過這種模式進行綁定的報表,可以不用設定其資料庫驗證參數(DBLogon)的相關資訊,具體的資料來源可以來源於資料庫,也可以來源於xml檔案等其他半結構化資料。
- 在VS IDE項目的Solution Explorer中,建立存放報表檔案的檔案夾,如ReprotFilesFolder
- 用滑鼠右鍵點擊建立的檔案夾,選擇添加新項(Add New Item...)
- 選擇“XML Schema”,將檔案命名為Demo.xsd
- 用DataSet Editor開啟該Schema檔案,點擊“Ctrl+Alt+S”,開啟“Server Explorer”,找到當前項目使用的資料庫連接,將報表展示涉及到的資料表拖拽到設計地區
- 推拽的表可以是存在索引值關係的表,也可以是毫無關係的表,甚至通過預存程序建立的暫存資料表,儲存該xsd檔案
- 用滑鼠右鍵點擊建立的檔案夾,選擇添加新項(Add New Item...)
- 選擇Crystal Report,將報表檔案命名為Demo.rpt,點擊添加(Add)
- 在開啟的水晶報表精靈視窗中選擇“使用報表精靈”,點擊確定
- 在報表精靈的資料嚮導頁中,選擇“建立新串連-資料庫檔案”
- 點擊資料庫檔案前的“+”,將彈出選擇資料檔案視窗,找到剛才建立的Demo.xsd檔案,並點擊“開啟”
- 此時,我們剛添加到Demo.xsd中的兩個資料表將出現在“資料檔案”節點的子節點下,選中資料表,點擊“>”按鈕,將表添加到“已選擇表”列表中
- 點擊“下一步”,可以為表之間添加隱式的索引值關係
- 點擊完成,將產生一張空白的報表
- 根據實際的業務情況設計符合要求的報表,並儲存報表檔案,例如
- 設計工作到此告一段落,下面將進行資料的綁定。
- 建立一個WebForm頁面,將CrystalReportViewer添加到頁面中,如所示
- 在後台頁面中首先引用Crystal Reports的程式集
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
- 定義變數
private ReportDocument reportDocument;
- 添加自訂方法
/// <summary> /// 初始化報表 /// </summary> private void ConfigureCrystalReports() { //當前業務的報表列印檔案 string RPTFile = ""; //當前業務的報表列印資料集 DataSet ds = null; #region 擷取報表列印檔案 if (Session["rf"] == null) { RPTFile = Server.MapPath("Demo.rpt"); Session["rf"] = RPTFile; } else RPTFile = Session["rf"].ToString(); #endregion #region 擷取當前業務的報表列印資料 if (Session["pd"] == null) { ds = new DataSet(); string sql = ""; sql = "select * from SalesMaster where BItemSerialNumber='0802280001'"; DataSet masterDs = 填充主表資料 //將主表添加到報表資料集中 ds.Merge(masterDs); //利用同樣的方法添加子表或其他的表,甚至可以添加表和表之間的關係 //上述方法也可以從其他資料來源讀入資料,包括Access資料庫、xml資料等 Session["pd"] = ds; } else ds = (DataSet)Session["pd"]; #endregion if (Session["reportDocument"] == null) { reportDocument = new ReportDocument(); reportDocument.Load(RPTFile); reportDocument.SetDataSource(ds); Session["reportDocument"] = reportDocument; } else reportDocument = (ReportDocument)Session["reportDocument"]; ReportViewer.ReportSource = reportDocument; } |
- 在頁面的Page_Load方法中添加Response.Expires = -1;
- 添加頁面初始化方法
/// <summary> /// 頁面初始化事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Init(object sender, EventArgs e) { ConfigureCrystalReports(); } |
- 至此,報表的資料繫結及顯示工作完成。編譯項目後,在瀏覽器中可以查看報表效果。此種方法的靈活性在於
- 完成後,完全可以刪除.xsd的Schema檔案而運行,或將.xsd檔案移出項目。
- 資料的讀入,不論來自SQL Server、Access還是xml資料,只要符合我們設定的Schema的表格式,即可以綁定到報表中。
- 我們也可以修改並強化上述的ConfigureCrystalReports方法,並建立系統管理頁面,在管理頁面上進行資料來源的選擇和設定等。
- 水晶報表的簡單模式部署
將水晶報表部署到目標伺服器的原因是,.NET Framework的安裝中並沒涵蓋水晶報表的合成項。在之前,曾經聽說過程式員為了將水晶報表的支援部署到伺服器,而在伺服器上安裝VS IDE的事情。因此,在這裡給一個簡單的方法。
- 在安裝了VS IDE的開發機環境中,開啟資源管理員
VS2005定位到:
%systemroot%/Program Files/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper/Packages/CrystalReports
VS2008定位到:
%systemroot%:/Program Files/Microsoft SDKs/Windows/v6.0A/Bootstrapper/Packages/CrystalReports10_5
- 在上述檔案夾中找到CRRedist2005_x86.msi或CRRedist2008_x86.msi檔案,在伺服器上安裝即可