c#水晶報表教程


c#水晶報表教程

http://apps.hi.baidu.com/share/detail/24298108

水晶報表是一個功能強大的報表工具,現在已經被Microsoft Visual Studio 2005(下文以VS2005簡稱)集成在一起。喜歡水晶報表的朋友可以方便使用了。我把水晶報表在vs2005的使用方法總結一下,供大家參考。
首先介紹一下我用的軟件環境:Microsoft Visual Studio 2005Microsoft SQL Server 2005
【數據用例】
服務器:SQLEXPRESS
數據庫名:Test
數據庫表:T

【說明】
水晶報表在應用時分兩種方法,分別是拉 模式(PULL)、推模式(PUSH)。拉模式:在水晶報表生成時的 數據源是從水晶報表文件中的SQL語句從數據庫中提取的,在編程時不用重寫SQL語句,但要加上登錄信息(具體方法,后面介紹)。推模式:在水晶報表生成 時的數據源,是用編程時重寫水晶報表中SQL語句而生成的dataset對像。也就是說,推模式是用dataset組裝水晶報表。
水晶報表組件介紹。水晶報表在VS2005中有兩種組件,在WEB項目是分別是CrystalReportSourceCrystalReportViewer。在FORM項目里是分別是crystalReportCrystalReportViewer
CrystalReportSourcecrystalReport是水晶報表的數據提供者;CrystalReportViewer是水晶報表的瀏覽器。另外還要介紹一下水的報表的文件是以rpt為擴展名的文件,該文件可以用VS2005生成。
下面分別介紹具體操作方法:
拉模式(PULL):
在拉模式中如要在水晶報表中的SQL語句加上條件參數時要用{?參數名}方式給出。例:“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是參數名

以下例子中所用到的水晶報表文件中使用的SQL語句是“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是參數名。
WEB方式下】
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
    ///<summary>
    ///功能:拉模式提取水晶報表
   ///個人主頁:http://www.dzend.com/
    ///</summary>
    ///<param name="sender"></param>
    ///<param name="e"></param>
    protected void Button_pull_Click(object sender, EventArgs e)
{
// CrystalReport.rpt是水晶報表文件的名稱;CrystalReportSource1是從工具箱加到頁面上的水晶報表數據源對像。

        CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));
// SetDatabaseLogon 拉模式中必須用這個方法來設置登錄信息,參數一:用戶名;參數二:密碼;參數三:服務器;參數四:數據庫名
        CrystalReportSource1.ReportDocument.SetDatabaseLogon("sa", "123456", @"SYWZSWL\SQLEXPRESS", "Test");
//給水晶報表傳參數,參數一:是參數名,參數二:參數值;
        CrystalReportSource1.ReportDocument.SetParameterValue("Title", "這是一個測試報表");
        CrystalReportSource1.ReportDocument.SetParameterValue("Parm", "1");
//綁定水晶報表數據源。
        CrystalReportSource1.DataBind();
// CrystalReportViewer1是水晶報表瀏覽器,下面是給該瀏覽器賦上對像
        CrystalReportViewer1.ReportSource = CrystalReportSource1;
        CrystalReportViewer1.DataBind();

    } FORM方式下】
//在 FORM方式下代碼同WEB方式,用crystalReport控件換掉了CrystalReportSource;用 crystalReportViewer換掉了CrystalReportViewer;這兩個控件都可以在工具箱里找到。同時在編程時去掉 DataBind()方法。
        private void Form1_Load(object sender, EventArgs e)
        {

            crystalReport1.Load(Application.StartupPath + "CrystalReport.rpt");

            crystalReport1.SetDatabaseLogon("sa", "123456", @"SYWZSWL\SQLEXPRESS", "Test");

            crystalReport1.SetParameterValue("Title", "這是一個測試報表");
            crystalReport1.SetParameterValue("Parm", "1");
            crystalReportViewer1.ReportSource = crystalReport1;

        }


推模式(PUSH):
在推模式中編程組裝的Dataset里的SQL語句中的字段要與水晶報表里的SQL語句字段一致。簡單的說,推模式中的水晶報表是個模板,把在設計器里報表的格式設好后,再組裝DataSet就可以生成報表了。


WEB方式下】

using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using System.Data.SqlClient;
       protected void Button_push_Click(object sender, EventArgs e)
    {
        string sql = "Select T1, T2, T3 FROM T where T1=''a''";
        string DBConfig_sql =@"Data Source=SYWZSWL\SQLEXPRESS;Initial Catalog=Test;User ID=sa;Password=123456";
        DataSet ds = new DataSet();
            SqlConnection sqlCon = new SqlConnection(DBConfig_sql);
            SqlCommand sqlCmd = new SqlCommand(sql, sqlCon);
            SqlDataAdapter sqlAd = new SqlDataAdapter();
            sqlAd.SelectCommand = sqlCmd;
            sqlAd.Fill(ds, "sql");
        CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));   
        //注意此處必需指明Dataset中的表的名稱,否則會提示您請求的報表需要更多信息.”
CrystalReportSource1.ReportDocument.SetDataSource(ds.Tables["sql"]);
//{?}中的參數可以不用賦值,即使賦了值也不起作用。
       // CrystalReportSource1.ReportDocument.ParameterFields["Parm"].CurrentValues.AddValue("1234567");
        CrystalReportSource1.ReportDocument.ParameterFields["Title"].CurrentValues.AddValue("這時推模式的報表樣例!");
        CrystalReportSource1.DataBind();

        CrystalReportViewer1.ReportSource = CrystalReportSource1;
         CrystalReportViewer1.DataBind();
    }
FORM方式下】
private void Form1_Load(object sender, EventArgs e)
        {
            //推模式
            string sql = "Select T1, T2, T3 FROM T where T1=''a''";
            string DBConfig_sql = @"Data Source=SYWZSWL\SQLEXPRESS;Initial Catalog=Test;User ID=sa;Password=123456";
            DataSet ds = new DataSet();
            SqlConnection sqlCon = new SqlConnection(DBConfig_sql);
            SqlCommand sqlCmd = new SqlCommand(sql, sqlCon);
            SqlDataAdapter sqlAd = new SqlDataAdapter();
            sqlAd.SelectCommand = sqlCmd;
            sqlAd.Fill(ds, "sql");
            crystalReport1.Load(Application.StartupPath + "CrystalReport.rpt");
            crystalReport1.SetDataSource(ds.Tables["sql"]);
//{?}中的參數可以不用賦值,即使賦了值也不起作用。
            // CrystalReportSource1.ReportDocument.ParameterFields["Parm"].CurrentValues.AddValue("1234567");
            crystalReport1.ParameterFields["Title"].CurrentValues.AddValue("這時推模式的報表樣例!");

            crystalReportViewer1.ReportSource = crystalReport1;
}


------------------------------------------------------------------------------------------------------------------------------------------------------------


水晶報表編程使用方法

1.怎么讓組頁眉,在同一組中每一頁都顯示
     插入組的時候,在公用選項頁面選中在每個頁面上重復組頁眉” 
2.如何向 CrystalReportViewer 和 ReportDocument 傳遞參數…… 
     一、CrystalReportViewer
             通過 CrystalReportViewer.ParameterFieldInfo 屬性……
            1crystalreportviewer 成員
                  公共實例屬性
                  ParameterFieldInfo(從 CrystalReportViewerbase 繼承) ParameterFields。獲取或設置參數字段集合。 
     二、reportdocument
             通過 ReportDocument.DataDefinition.ParameterFields 屬性……
            1reportdocument 成員
            公共實例屬性
            DataDefinition DataDefinition。獲取 DataDefinition 對象。 
            2datadefinition 成員
            公共實例屬性
            ParameterFields ParameterFieldDefinitions。獲取 ParameterFieldDefinitions 集合。 
     三、參數字段運行時自定義(crystalreportviewer
             參考:
            設置參數 | Windows 窗體查看器的綁定選項 | Web 窗體查看器的綁定選項 
            可支持用戶在 Crystal 報表中通過參數進行輸入。這種參數有多種用途。例如: 
            使參數基於數據庫字段並允許用戶指定該字段的值,以便對報表中的數據進行篩選。 
            使用參數字段將條件格式應用於報表。 
            使用參數字段來定義排序順序。 
            下列示例說明如何在運行時通過代碼設置參數字段值。此例解釋了如何設置兩個不同的參數:第一個是多值離散參數,第二個是區域值參數。 
在運行時修改參數字段
[c#] 
// 聲明將參數傳遞給
//查看器控件所需的變量。
ParameterFields paramFields = new ParameterFields ();
ParameterField paramField = new ParameterField ();
ParameterDiscreteValue discreteVal = new ParameterDiscreteValue ();
ParameterRangeValue rangeVal = new ParameterRangeValue ();
// 第一個參數是具有多個值的離散參數。
// 設置參數字段的名稱,它必須
//和報表中的參數相符。
paramField.ParameterFieldName = "客戶姓名";
// 設置第一個離散值並將其傳遞給該參數。
discreteVal.Value = "AIC Childrens";
paramField.CurrentValues.Add (discreteVal);
// 設置第二個離散值並將其傳遞給該參數。
// discreteVal 變量被設置為新值,這樣,以前的設置
//就不會被覆蓋。
discreteVal = new ParameterDiscreteValue ();
discreteVal.Value = "Aruba Sport";
paramField.CurrentValues.Add (discreteVal);
// 將該參數添加到參數字段集合。
paramFields.Add (paramField);
// 第二個參數為區域值。paramField 變量
//被設置為新值,這樣,以前的設置就不會被覆蓋。
paramField = new ParameterField ();
// 設置參數字段的名稱,它必須
//和報表中的參數相符。
paramField.ParameterFieldName = "客戶 ID";
// 設置范圍的開始值和結束值並將該范圍傳遞給
//該參數。
rangeVal.StartValue = 42;
rangeVal.EndValue = 72;
paramField.CurrentValues.Add (rangeVal);
// 將第二個參數添加到參數字段集合。
paramFields.Add (paramField);
// 將參數字段集合放入查看器控件。
crystalReportViewer1.ParameterFieldInfo = paramFields;
更多資料請查看:http://www.devedu.com/develop/2005-4-8/12305/default.aspx
3.設置Crystal Report Viewer 的外觀
     設置 Crystal Report Viewer 的屬性:
     BestFitPage 布爾值。獲取或設置頁面視圖是大小合適還是用滾動條進行裁剪。
     這個地方設為false后,設置Crystal Report Viewer 的寬度就可以去除滾動條了。
     說明 :目前有兩種情況,其中在從 Web 窗體查看器進行打印時會出現問題:
     BestFitPage屬性為默認值(即,沒有垂直或水平滾動條),但PageZoomFactor大於 100。 
     BestFitPage 設置為Web 窗體查看器的高度小於報表頁的高度(即,有垂直滾動條),而查看器的寬度大於或等於報表頁的寬度(即,沒有水平滾動條)。
     配合設置 WidthHeight 來實現無空白和無滾動條的顯示!
     DisplayGroupTree 布爾值。獲取或設置樹視圖是可見還是隱藏。 
    DisplayPage 布爾值。獲取或設置工具欄是可見還是隱藏。 
    DisplayToolbar 布爾值。獲取或設置工具欄上的轉到頁按鈕是可見還是隱藏。 
    PageZoomFactor Int32。獲取或設置報表的縮放因數。 

    SeparatePages 布爾值。獲取或設置報表頁是分開還是連接。
    PageToTreeRatio Float64。設置組樹與報表視圖之間的大小比例。
4.控制工具欄的按鈕:
    設置 Crystal Report Viewer 的屬性:
    HasGotoPageButton 布爾值。獲取或設置轉到頁按鈕的可見性。 
    HasLevelUpButton 布爾值。獲取或設置工具欄上的轉到上一頁按鈕是可見還是隱藏。 
    HasPageNavigationButtons 布爾值。獲取或設置工具欄上的頁面導航按鈕是可見還是隱藏。 
    HasRefreshButton 布爾值。獲取或設置工具欄上的刷新按鈕是可見還是隱藏。 
    HasSearchButton 布爾值。獲取或設置工具欄上的搜索按鈕是可見還是隱藏。 
    HasZoomFactorList 布爾值。獲取或設置工具欄上的縮放因數列表是可見還是隱藏。
5.在 Web 頁面里的布局:
    在設計視圖,修改 CrystalReportViewer 的 WidthHeight 屬性。
    切換到窗體的“HTML 視圖,修改 style 屬性。
<CR:CrystalReportViewer id="CrystalReportViewer1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server" Width="350px" Height="50px" EnableDrillDown="False" DisplayGroupTree="False"></CR:CrystalReportViewer>
6.除水晶報表的的公司LOGO
    將 Crystal 公司的Logo 文件替換或刪除……
    (1)如果是用 VS.NET 里自帶的水晶報表
C:\Program Files\Microsoft Visual Studio .NET\Crystal Reports\Viewers\images\ToolBar\logo.gif
    (2)如果是用水晶報表 9.2
C:\Program Files\Common Files\Crystal Decisions\2.0\crystalreportviewers\images\toolbar\crlogo.gif
7.替換水晶報表里的各種圖標和圖片
    (1)如果是用 VS.NET 里自帶的水晶報表
C:\Program Files\Microsoft Visual Studio .NET\Crystal Reports\Viewers\images
    (2)如果是用水晶報表 9.2
C:\Program Files\Common Files\Crystal Decisions\2.0\crystalreportviewers\images
8.關於打印的時候安裝插件:
    在 Crystal Reports 的更新版本中,您可以使用新的 CrystalReportViewer.PrintMode 屬性來指定打印模式。其中包含兩個選擇項:ActiveX 和 PDF。 
   當屬性設置為PrintMode.PDF 時,報表會在WEB服務器上導出為PDF,然后以數據流傳送到瀏覽器,使用者可以利用選項,直接打印到打印機。這個選項是跨平台相容的。
當屬性設置為PrintMode.ActiveX時,ActiveX 打印控制項允許使用者將報表直接打印到本地打印機

先下載 http://support.businessobjects.com/CRforVS2005/PrintControl.cab,放到自已的服務器上。

若要在 Crystal Reports for Visual Studio 2005 網站顯示 cab 包,需將下列 xml 語句加入網站的 web.config 文件(必須加到<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">之后,也就是最前面):
<configSections>
<sectionGroup name="businessObjects">
   <sectionGroup name="crystalReports">
    <section name="printControl" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/>
   </sectionGroup>
</sectionGroup>
</configSections>
<businessObjects>
<crystalReports>
   <printControl>
    <add key="url" value="http://192.168.88.91/PrintControl.cab"/>   --這里改為.CAB包所在地址
   </printControl>
</crystalReports>
</businessObjects>
注意:只有 Internet Explorer 才會支持 ActiveX 模式。若從非 Internet Explorer 的瀏覽器 (FireFoxSafariMozilla 打印,將會恢復到 PDF 彈出對話框。

然后在打印的頁面或直接在主窗體添加一個層,並在層中添加如下代碼(可以采用其他方式)
<object id="CrystalPrintControl" classid="CLSID:BAEE131D-290A-4541-A50A-8936F159563A"
    codebase="http://192.168.88.91/printcontrol.cab" height="0px" version="10,2,0,1078"
    viewastext="" width="0px">
</object>
version是版本號,如果你是其他的版本將版本號修改一下即可。
9.已達到系統管理員配置的最大報表處理作業數限制的處理
   解決辦法:
   具體為修改下面兩個鍵的值。
   HKEY_LOCAL_MACHINE;SOFTWARE;Crystal Decisions;10.0;Report Application
   Server;InprocServer;PrintJobLimit 修改為1000
   還有一個HKEY_LOCAL_MACHINE;SOFTWARE;Crystal Decisions;10.0;Report Application
   Server;Server;PrintJobLimit 也修改為1000 
   我發現在C:\WINDOWS\Temp這個臨時文件里面有大量的水晶報表文件,每使用一次就會生成幾個文件,在電腦沒有重新啟動的情況下它不會被刪除而出現大量的無用文件,google里面搜了一圈發現也有人碰到這樣的情況但回答的很模糊只是說要將水晶報表裝載的文檔關閉掉,從這里可以看出出現這樣 的錯誤應該是程序員人為照成的.
    具體解決如下:
          1.ReportDocumen實例必須為類成員    
             private ReportDocument prtp = new ReportDocument();   
          2.使用完水晶報表必須關閉文件,這樣子就不會在windows的臨時文件里面產生.
              private void Page_Unload(object sender, EventArgs e)
              {
                    prtp.Dispose();
              }
             Page_Unload 事件是在頁面完全顯示的時候運行,這樣子就解決了.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM