本文主要劃分為以下六部分:
一、Crystal Report for .NET 的功能
二、Crystal Report總體結構
三、報表數據訪(fǎng)問(wèn)執行模式
四、報表類(lèi)型
五、Crystal Report 設計器的布局
六、Crystal Report 的具體實(shí)例
最近項目接近尾聲,應要求總結了一下,為了對在.net環(huán)境下開(kāi)發(fā)報表的程序員新手一些幫助,同時(shí)也為給新人培訓做一次文檔準備。
相信在大部分的應用程序中報表都是程序員頭疼的問(wèn)題。但是在.net環(huán)境下包含了功能強大的報表工具: Crystal Report。它能很好的與數據庫交互,做出各種漂亮的報表和分析圖表.它能良好地替開(kāi)發(fā)人員排憂(yōu)解難。如下圖:

從1993年開(kāi)始,Crystal Report 就是Visual Studio 套件中的一部分。目前實(shí)際上已成為
Visual Studio.NET 中的報表標準,在Windows 報表編寫(xiě)領(lǐng)域中居于領(lǐng)先地位,推動(dòng)著(zhù)Web報表的未來(lái)發(fā)展。最新的Visual Studio.NET 以集成開(kāi)發(fā)環(huán)境(IDE)中整和了Crystal Report9.0,從而增強了Visual Studio.NET 的開(kāi)發(fā)功能, Crystal Report 為開(kāi)發(fā)人員提供了盡可能的API。
一、Crystal Report for .NET 的功能
通過(guò)將Crystal Report 的報表處理功能整和到自己的數據庫應用程序中,Windows應用程序和Web開(kāi)發(fā)人員可以節省開(kāi)發(fā)時(shí)間來(lái)滿(mǎn)足用戶(hù)的需求。Crystal Report 支持大多數流行的開(kāi)發(fā)語(yǔ)言,可以方便的在任何應用程序中添加報表。
具體來(lái)說(shuō),Crystal Report的功能有以下幾點(diǎn):
1、全面的數據庫訪(fǎng)問(wèn):
Crystal Report 中包括了超過(guò)35中數據源驅動(dòng),可以訪(fǎng)問(wèn)一種XML、企業(yè)和關(guān)系型數據庫。
2、廣泛的設計格式與設計:
通過(guò)Crystal Report,用戶(hù)可以將數據庫轉換為高度交互性?xún)热???梢詮?span>100多中格式選項中進(jìn)行選擇、包括參數、映射、交叉表和超級鏈接、用以強化報表的沖擊力。
3、強大的圖表設計功能:
Crystal Report 可以在報表中包含多彩的、易讀的圖表(提供了非常豐富的報表類(lèi)型,如:條形圖、折線(xiàn)圖、面積圖、餅圖、甘特圖、股票圖等)。
4、靈活的應用集成技術(shù):
Crystal Report 帶有靈活的Java、COM和.NET SDK,以及可內嵌的Report Application Server,可將報表與企業(yè)Web應用緊密地集成在一起。通過(guò)使用Crystal Report 的"零"客戶(hù)端瀏覽器控制,能夠為最終端擁護提供豐富的報表交互、創(chuàng )建和修改功能。
5、強大的報表導出:
Crystal Reprort 的所有的報表都可以導出多種不同的格式:包括XML、PDF、HTML、和Microsoft Excel。
二、Crystal Report總體結構
展示報表具有兩層結構的Crystal Report需要:
界面:
界面僅需使用Winform窗體或者Web程序中使用瀏覽器。
后臺:
1、Crystal Report Engine (CREngine.dll)
將數據與報表文件合并、將數據輸出為不同的格式,將Crystal Report轉為傳到.aspx頁(yè)中的簡(jiǎn)潔明了的HTML.
2、Crystal Report Designer (CRDesigner.dll)
使用Crystal Report Designer可以制作報表,可以設計標題、插入數據、公式、表格、次級報告等。
3、The .rpt Report file
將一份報表應用到你的應用程序中的第一步是使用Crystal Report Designer創(chuàng )建報表。但是如果已經(jīng)有了一些現成的樣本,你現在就可以用它。
4、The Data Source
.rpt文件獲取數據的方式取決于你所選用的方法。你可以選擇制作Crystal Report以獲取數據而無(wú)須手工寫(xiě)任何代碼,也可以選擇綁定你的dataset并將其傳入報表文件。
5、Crystal Report Viewer
Crystal Report Viewer是一個(gè)能夠插入頁(yè)中的容器(.net中習慣稱(chēng)為控件)。
三、報表數據訪(fǎng)問(wèn)執行模式
1、拉模型 Pull Model
在拉模型中,驅動(dòng)程序將連接到數據庫并根據需要將數據“拉”進(jìn)來(lái)。使用這種模型時(shí),與數據庫的連接和為了獲取數據而執行的 SQL 命令都同時(shí)由 Crystal Reports 本身處理,不需要開(kāi)發(fā)人員編寫(xiě)代碼。如果在運行時(shí)無(wú)須編寫(xiě)任何特殊代碼,則使用拉模型。
2、推模型 Push Model
相反,推模型需要開(kāi)發(fā)人員編寫(xiě)代碼以連接到數據庫,執行 SQL 命令以創(chuàng )建與報表中的字段匹配的記錄集或數據集,并且將該對象傳遞給報表。該方法使您可以將連接共享置入應用程序中,并在 Crystal Reports 收到數據之前先將數據篩選出來(lái)。
四、報表類(lèi)型
Crystal Report Designer可以是獨立于解決方案的報表外,也可是裝載包含于解決方案方案之中的報表。
1、Strongly-typed Report :
當在方案中加入一個(gè)報表時(shí),該報表就成為一個(gè)Strongly-typed Report。在這種情況下,你可以直接創(chuàng )建報表實(shí)例(可以減少若干代碼),可以將其隱藏。當然你可以點(diǎn)擊Solution Explorer中的”show all files”來(lái)顯示它。
2、Un-Typed Report :
不包含在方案中的報表即Un-Typed Report。在這種情況下,必須創(chuàng )建一個(gè)Crystal Report Engine的'Report Document'對象并將報表手工裝載進(jìn)去。
五、Crystal Report 設計器的布局
首先,在Visual Studio.NET 的一個(gè)工程中添加一個(gè)向 Windows 或 Web 窗體發(fā)布數據的 Crystal 報表文件:

添加成功之后,打開(kāi)該報表:

從上圖可以看到設計器的完整布局。
1、字段資源管理器:
列出該報表所有的字段,如:使用的數據庫字段、參數字段、公式字段等??梢栽诖诵薷暮蛣h除字段對象。
2、主報表窗口:
用來(lái)在報表窗口中顯示主報表。對于包含子報表的報表,有主報表窗口和對每個(gè)的深化(通過(guò)雙擊)的子報表有一個(gè)
子報表窗口??梢酝ㄟ^(guò)右擊報表窗口的任何空白位置來(lái)啟動(dòng)報表快捷菜單。
3、水晶報表主工具欄:
包括記錄選擇、分類(lèi)和文本對象格式化圖標??梢詫φ麄€(gè)工具欄移動(dòng)或改變大小。
4、水晶報表插入工具欄:
可以插入匯總字段、組、子報表、圖表和圖片的圖標。也可以在Crystal Report工具欄中單擊鼠標來(lái)選擇"插入"。
六、Crystal Report 的具體實(shí)例
本部分的例子分成兩部分:Windows應用程序中的Crystal Report開(kāi)發(fā);Web應用程序中的Crystal Report開(kāi)發(fā)應用。并且在兩種環(huán)境下分別介紹拉模型與推模型的例子。
在本部分例子中使用的軟件環(huán)境:Microsoft Visual Studio 2005;Microsoft SQL Server 2005。數據例子如下:服務(wù)器:cotton-b數據庫名:lhcy數據庫表:ProjectStage
數據表結構:

數據:

主要功能為統計項目階段工時(shí)數。
1、 如何設計報表文件模版。
1) 增加一個(gè)結果集 DataSet1.xsd,并增加表

2) 首先在增加一個(gè)報表文件 rpt文件

3) 使用報表專(zhuān)家,在"項目數據"中選擇"ADO。NET數據集",插入"ProjectStage"表,在字段選擇器上選擇要在報表上

4) 選擇要分組的字段依據

5) 選擇展示的圖表和顯示的主題信息

最終生成的結果如下。

2、Windows應用程序中的Crystal Report開(kāi)發(fā)
2.1 拉模型 pull model 的demo
在拉模式中如要在水晶報表中的SQL語(yǔ)句加上條件參數時(shí)要用{?參數名}方式給出。
例:“SELECT ProjectID, Manhours FROM ProjectStage Where ProjectID ={?parm}” parm就是參數名.
private void Form1_Load(object sender, EventArgs e)
{
ReportDocument rpt=new ReportDocument();
rpt.Load(Application.StartupPath + "CrystalReport.rpt");
//SetDatabaseLogon 拉模式中必須用這個(gè)方法來(lái)設置登錄信息,參數一:用戶(hù)//名;參數二:密碼;參數三:服務(wù)器;參數四:數據庫名
rpt.SetDatabaseLogon("sa","123456", "cotton-b", "lhcy");
// 給水晶報表傳參數,參數一:是參數名,參數二:參數值;
rpt.SetParameterValue("Parm", 1);
rpt.SetParameterValue("Title", "拉模型demo");
// CrystalReportViewer1是水晶報表瀏覽器,下面是給該瀏覽器賦上對像
crystalReportViewer1.ReportSource = rpt;
}

2.2推模型 push model的demo
在推模式中編程組裝的Dataset里的SQL語(yǔ)句中的字段要與水晶報表里的SQL語(yǔ)句字段一致。簡(jiǎn)單的說(shuō),推模式中的水晶報表是個(gè)模板,把在設計器里報表的格式設好后,再組裝DataSet就可以生成報表了。
private void Form1_Load(object sender, EventArgs e)
{
CrystalReport1 report = new CrystalReport1();
string sDBConnetction = "Data Source=cotton-b;Initial Catalog=lhcy;Persist Security Info=True;User ID=sa;Password=123456";
DataSet1 ds = new DataSet1();
SqlConnection conn = new SqlConnection(sDBConnetction);
SqlDataAdapter adapterProjectStage = new SqlDataAdapter
("select * from ProjectStage where ProjectID=2", conn);
adapterProjectStage.Fill(ds, "ProjectStage");
report.SetDataSource(ds);
report.SetParameterValue("Title", "推模型demo");
crystalReportViewer1.ReportSource = report;
}

3、Web應用程序中的Crystal Report開(kāi)發(fā)
3.1 拉模型 pull model 的demo
與Winform應用程序的拉模型一樣,要在水晶報表中的SQL語(yǔ)句加上條件參數時(shí)要用{?參數名}方式給出。
例:“SELECT ProjectID, Manhours FROM ProjectStage Where ProjectID ={?parm}” parm就是參數名.
protected void Test_pullmodel (object sender, EventArgs e)
{
// CrystalReport.rpt是水晶報表文件的名稱(chēng);CrystalReportSource1是從工具箱加到頁(yè)面上的水晶報表數據源對像。
CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));
// SetDatabaseLogon 拉模式中必須用這個(gè)方法來(lái)設置登錄信息,參數一:用戶(hù)名;參數二:密碼;參數三:服務(wù)器;參數四:數據庫名
CrystalReportSource1.ReportDocument.SetDatabaseLogon("sa","123456", "cotton-b", "lhcy");
//給水晶報表傳參數,參數一:是參數名,參數二:參數值;
//CrystalReportSource1.ReportDocument.SetParameterValue("Title", "拉模型的demo");
CrystalReportSource1.ReportDocument.SetParameterValue("Parm", 1);
//綁定水晶報表數據源。
CrystalReportSource1.DataBind();
// CrystalReportViewer1是水晶報表瀏覽器,下面是給該瀏覽器賦上對像
CrystalReportViewer1.ReportSource = CrystalReportSource1;
CrystalReportViewer1.DataBind();
}

3.2推模型 push model的demo
string sDBConnetction = "Data Source=cotton-b;Initial Catalog=lhcy;Persist Security Info=True;User ID=sa;Password=123456";
DataSet1 ds = new DataSet1();
SqlConnection conn = new SqlConnection(sDBConnetction);
SqlDataAdapter adapterProjectStage = new SqlDataAdapter("select * from ProjectStage where ProjectID=2", conn);
adapterProjectStage.Fill(ds, "ProjectStage");
CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));
CrystalReportSource1.ReportDocument.SetDataSource(ds.Tables["ProjectStage"]);
CrystalReportSource1.DataBind();
CrystalReportViewer1.ReportSource = CrystalReportSource1;
CrystalReportViewer1.DataBind();

聯(lián)系客服