使用水晶報表的強大功能來實現(xiàn)應(yīng)用程序的統(tǒng)計分析及打印導(dǎo)出等功能,是微軟平臺上進行.NET應(yīng)用程序開發(fā)報表的一種不錯的選擇。水晶報表在設(shè)計、開發(fā)、配置以及部署上,還是會給初學者帶來一定的困擾的。那么,是否存在一種相對比較簡單而且易用的方式來進行水晶報表的設(shè)計、開發(fā)、配置以及部署呢?本文將提供一種比較簡單且相對靈活的方法。 本文將包含以下內(nèi)容:
Crystal Reports的另類非對象模式數(shù)據(jù)綁定 水晶報表的簡單模式部署 P.S. 本文中描述到的Crystal Reports為Crystal Reports for Visual Studio .NET,原則上該版本是runtime free授權(quán),for unlimited user的。VS IDE版本為2008,Crystal Reports版本為10
Crystal Reports的另類非對象模式數(shù)據(jù)綁定 水晶報表綁定數(shù)據(jù)的模式有很多種,其中包括使用DataSet、DataReader及ObjectCollection等。在某個特定的系統(tǒng)項目中,我們多數(shù)通過指定的業(yè)務(wù)數(shù)據(jù)庫來提供對報表數(shù)據(jù)的支持。本文將主要描述一種非數(shù)據(jù)庫數(shù)據(jù)綁定的變通模式,通過這種模式進行綁定的報表,可以不用設(shè)置其數(shù)據(jù)庫驗證參數(shù)(DBLogon)的相關(guān)信息,具體的數(shù)據(jù)源可以來源于數(shù)據(jù)庫,也可以來源于xml文件等其他半結(jié)構(gòu)化數(shù)據(jù)。 在VS IDE項目的Solution Explorer中,建立存放報表文件的文件夾,如ReprotFilesFolder 用鼠標右鍵點擊新建的文件夾,選擇添加新項(Add New Item...) 選擇“XML Schema”,將文件命名為Demo.xsd 用DataSet Editor打開該Schema文件,點擊“Ctrl+Alt+S”,打開“Server Explorer”,找到當前項目使用的數(shù)據(jù)庫連接,將報表展示涉及到的數(shù)據(jù)表拖拽到設(shè)計區(qū)域 推拽的表可以是存在鍵值關(guān)系的表,也可以是毫無關(guān)系的表,甚至通過存儲過程建立的臨時表,保存該xsd文件 用鼠標右鍵點擊新建的文件夾,選擇添加新項(Add New Item...) 選擇Crystal Report,將報表文件命名為Demo.rpt,點擊添加(Add) 在打開的水晶報表向?qū)Т翱谥羞x擇“使用報表向?qū)А,點擊確定 在報表向?qū)У臄?shù)據(jù)向?qū)ы撝,選擇“創(chuàng)建新連接-數(shù)據(jù)庫文件” 點擊數(shù)據(jù)庫文件前的“+”,將彈出選擇數(shù)據(jù)文件窗口,找到剛才創(chuàng)建的Demo.xsd文件,并點擊“打開” 此時,我們剛添加到Demo.xsd中的兩個數(shù)據(jù)表將出現(xiàn)在“數(shù)據(jù)文件”節(jié)點的子節(jié)點下,選中數(shù)據(jù)表,點擊“>”按鈕,將表添加到“已選擇表”列表中 點擊“下一步”,可以為表之間添加隱式的鍵值關(guān)系 點擊完成,將生成一張空白的報表 根據(jù)實際的業(yè)務(wù)情況設(shè)計符合要求的報表,并保存報表文件,例如下圖 設(shè)計工作到此告一段落,下面將進行數(shù)據(jù)的綁定。 新建一個WebForm頁面,將CrystalReportViewer添加到頁面中,如下圖所示 在后臺頁面中首先引用Crystal Reports的程序集 using CrystalDecisions.CrystalReports.Engine; using CrystalDecisions.Shared; 定義變量 private ReportDocument reportDocument; 添加自定義方法 /// <summary> /// 初始化報表 /// </summary> private void ConfigureCrystalReports() { //當前業(yè)務(wù)的報表打印文件 string RPTFile = ""; //當前業(yè)務(wù)的報表打印數(shù)據(jù)集 DataSet ds = null;
#region 獲取報表打印文件 if (Session["rf"] == null) { RPTFile = Server.MapPath("Demo.rpt"); Session["rf"] = RPTFile; } else RPTFile = Session["rf"].ToString(); #endregion
#region 獲取當前業(yè)務(wù)的報表打印數(shù)據(jù) if (Session["pd"] == null) { ds = new DataSet(); string sql = ""; sql = "select * from SalesMaster where BItemSerialNumber='0802280001'"; DataSet masterDs = 填充主表數(shù)據(jù) //將主表添加到報表數(shù)據(jù)集中 ds.Merge(masterDs); //利用同樣的方法添加子表或其他的表,甚至可以添加表和表之間的關(guān)系
//上述方法也可以從其他數(shù)據(jù)源讀入數(shù)據(jù),包括Access數(shù)據(jù)庫、xml數(shù)據(jù)等
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(); }
至此,報表的數(shù)據(jù)綁定及顯示工作完成。編譯項目后,在瀏覽器中可以查看報表效果。此種方法的靈活性在于 完成后,完全可以刪除.xsd的Schema文件而運行,或?qū)?xsd文件移出項目。 數(shù)據(jù)的讀入,不論來自SQL Server、Access還是xml數(shù)據(jù),只要符合我們設(shè)定的Schema的表格式,即可以綁定到報表中。 我們也可以修改并強化上述的ConfigureCrystalReports方法,并建立系統(tǒng)管理頁面,在管理頁面上進行數(shù)據(jù)來源的選擇和設(shè)定等。 水晶報表的簡單模式部署 將水晶報表部署到目標服務(wù)器的原因是,.NET Framework的安裝中并沒涵蓋水晶報表的合成項。在之前,曾經(jīng)聽說過程序員為了將水晶報表的支持部署到服務(wù)器,而在服務(wù)器上安裝VS IDE的事情。因此,在這里給一個簡單的方法。 在安裝了VS IDE的開發(fā)機環(huán)境中,打開資源管理器 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文件,在服務(wù)器上安裝即可
|