報表作為信息組織和分析的有效手段和重要呈現形式,是企業管理信息系統的重要組成部分。如何方便、快捷、準確地生成各種統計報表,是一個值得研究的課題。本文通過對.Net平臺下的報表應用進行研究,讓讀者對水晶報表的應用有個全面認識,并能夠進行水晶報表的設計與開發。
.Net;水晶報表
1 引言
報表是一種數據管理工具,其目的是在于幫助用戶快速掌握原始數據中的基本關系,以便進行有效的決策。水晶報表(Crystal Reports)是一款主要用于設計及產生報表的軟件,是一個優秀的第三方報表開發工具,是業內最專業、功能最強的報表系統。它除了強大的報表功能外,最大的優勢是實現了與Visual Studio所有開發工具的集成。
Visual Studio .Net中的水晶報表是一個實現原理比較復雜但使用方法十分簡單的報表生成工具,它提供了非常豐富的模型,能夠在運行時操作屬性和方法,即可嵌入到C/S結構應用程序中,也可以加入到B/S結構的Web應用程序中。水晶報表可以在設計器中創建,用戶可以設計標題、插入數據、公式、圖表、子報表等操作。同時水晶報表查看器能夠用于顯示水晶報表的內容,包括圖和表。此外,它還具有一些自帶的功能,如翻頁、跳轉到某一頁、打印報表、刷新、放大縮小和查找等。因此水晶報表查看器也是一種功能強大的控件。
2 .Net平臺下水晶報表的控制模式
在.Net程序開發中,經常要對合并、匯總等進行編程,水晶報表大大簡化了這些工作,用它能生成漂亮的圖表和格式化文本,而且還能把報表導出為Word、Excel、PDF、HTML等格式。水晶報表程序控制上有兩種模式,即拉(PULL)模式和推(PUSH)模式。選擇的模式不同,程序實現上也會有很大差別。
2.1 拉模式(PULL)
拉模式是由水晶報表模板(引擎)直接連接數據庫,從數據庫里拉取數據。通常情況是我們在水晶報表里設置好數據庫信息以及相關的表,當我們在程序中調用水晶報表引擎,掛載模板后,水晶報表引擎會根據模板里的數據庫信息,及表信息主動連接數據庫,返回數據給報表模板,模板根據設計樣式進行呈現。
2.2 推模式(PUSH)
推模式是由應用程序從數據庫獲取數據,然后把數據推送給水晶報表引擎,水晶報表本身不跟數據庫進行交互。使用推模式將會比拉模式要多寫一些代碼。
2.3 拉模式與推模式的比較
由于拉模式是直接連接數據庫,和推模式相比,在推送給水晶報表引擎的過程中少了推送給中間結果集這么一個步驟,而中間結果集本身就占用系統資源,所以拉模式比推執行效率高。
在推模式中,數據庫是由應用程序去連接的,水晶報表本身不連接數據庫。這樣,系統就能使用公用的數據庫連接,也就節約了數據庫的連接消耗。這一點,在多用戶的系統環境內,少一次數據庫連接對系統和系統性能的影響是比較關鍵的。
當然我們也應該注意到,推模式因為存在一個中間結果集,所以會占用系統資源,也正是因為這個中間結果集的存在,使得從數據庫獲取數據后,能夠對數據進行再加工,從而使水晶報表更加靈活多變。所以在具體實現的時候,要綜合考慮實際情況來決定采用哪種模式實現。
3 .Net平臺下水晶報表的實現
.Net平臺下水晶報表開發最重要的步驟是數據的獲取。在拉模式中,數據獲取這一步驟是由.Net內置的水晶報表引擎自動處理,不需要編寫任何代碼,因此這里主要討論推模式的實現。實現過程主要涉及以下兩個文件:數據集(.xsd文件)、水晶報表(.rpt文件)。
3.1 實現步驟
(1)建立解決方案,在其管理器中添加數據集,在解決方案中生成.xsd格式的文件。具體過程為:添加→添加新項→類別→數據→模板→數據集。
(2)在服務器資源管理器中,添加數據連接,選擇所要連接的數據庫,將數據表拖到之前建立好的數據集上,保存整個項目。
(3)在解決方案資源管理器中,添加“Crystal Report”模板,通過“報表專家”完成報表設計。具體過程為:報表專家→數據庫專家→項目數據→ADO.NET數據集→選擇所需數據集對象→插入數據表。
3.2 關鍵功能代碼
(1)在項目的數據訪問層編寫獲取數據表字段的方法GetFields,該方法返回的為數據集。
Public static DataTable GetFields()
{
Database db= DatabaseFactory.CreateDatabase fftConnectionString");
String strSql= "select 列名集合 from 表名 WHERE 條件";
DataTable dtc=db.ExecuteDataSet(CommandType.Text,strSq1).Tables[0];
return dtc;//通過命令方式生成數據表
}
(2)添加Web頁面Page_Load事件處理程序。首先,實例化一個DataTable對象dtl,調用GetFields方法,將返回的數據集賦給dt1,然后將dt1綁定到相關顯示及格式化控件上。其次,實例化一個DataSet對象ds2,創建新命名的DataTable,比如,MyDataTable,并為其添加新列,比如,MyCol1、MyCol2,后將ds2用Session保存。
using CrystalDecisions.Shared;//必須引入水晶報表的類庫
using CrystalDecisions.CrystalReports.Engine;
CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));//制定報表路徑及文件
if (1sPostBack==false)//Form_Load()事件的部分代碼
{
DataTable dtl=new DataTable();
DropDownList1.DataSource= dt1;//將數據表中的數據加載到顯示或格式化數據空間,本例為DropDownList1.
DropDownList1.DataTextField="COLUMN_NAME";
DropDownList1.DataBind();
DataSet ds2=new DataSet();//生成數據集,本例為MyTable
ds2.Tables.Add("MyTable");
DataColurrm MyCol=new DataColumn();//生成數據列類,并添加新列
MyCol.ColumnName="MyCol1" ;
MyCol.DataType=System.Type.GetType ("System.String");
ds2.Tables["MyTable"].Columns.Add(MyCol);
MyCol=new DataColumn();
MyCol.ColumnName="MyCol2";
MyCol.DataType=System.Type.GetType("System.String");
ds2.Tables["MyTable"].Columns.Add(MyCol);
Session["dsTemp"]=ds2;//將數據集以變量形式保存為會話
}
(3)報表文件的綁定
DataTable MyTable=new DataTable();
MyCrysta1.SetDataSource(MyTable);//設置報表文件MyCrysta1的數據表來源
CrystalReportViewer1.ReportSource= MyCrysta1;//設置報表控件的報表文件來源
CrystalReportViewer1.Visible=true;//報表顯示
4 利用向導制作報表
除了使用程序方式開發報表外,還可利用報表向導輕松地完成一個報表。首先新建一個WebSite,添加報表,向導會提示創建一個數據源并打開數據庫工具,根據提示,很容易就能生成一個數據源,作為報表的數據來源。在報表設計器中,可以根據需要畫出想要的報表,并從“數據源”中選擇想要的數據。這樣,就完成了一個報表,接下來就可以使用ReportViewer控件來顯示這個報表了。新建一個WebForm,從工具箱中拖一個ReportViewer控件到頁面上,它會提示你選擇報表,我們就選擇剛才設計的報表,運行程序就能看到想要的東西了。
5 結束語
在ASP.NET環境下采用水晶報表開發Web動態報表,利用水晶報表本身提供的報表設計器和.Net提供的豐富特性,通過推模型從數據庫中讀取滿足查詢條件的數據,從而靈活地產生報表輸出。這種設計方法在系統開發中可以作為一種通用的查詢方法,因此能夠減少系統的開發和維護的工作量,極大地提高系統的開發效率。同時,可以減少系統的復雜度,增加報表系統開發的可復用度,是一種比較實用的報表系統解決方案。
參考文獻
[1]張榮圣,侯鵬志,郭圣路.Crystal Reports 2008.水晶報表從入門到精通.北京:電子工業出版社,2010.
[2]劉彥博,等.Visual Studio技術大全.成都:人民郵電出版社,2009.