1. 程式人生 > >ASP.NET中使用水晶報表

ASP.NET中使用水晶報表

在我們對VS.Net中的水晶報表(Crystal Reports)進行研究之前,我和我朋友對如何將這個複雜的東東加入我們的Web應用有著非常的好奇心。一週以後,在閱讀了大量的“HOWTO”文件之後,我們成功地將一些簡單的報告加入到了我們的Asp.net程式中,並得到了一些小決竅。 

這篇文章教你如何在.Net Web應用中使用水晶報表,也可以讓你在學習過程中少走一些彎路。為了得到最好的效果,讀者最好需要有一些基礎的Asp.Net訪問資料庫的知識以及使用VS.Net的開發經驗。 
簡介  
水晶報表可以由很多的方法得到,其中一個就是使用VS.Net來建立,它提供了非常豐富模型以使我們能夠在執行時操作屬性和方法。如果你正在使用VS.Net開發.Net程式,那麼你就不需要再安裝其它軟體了,因為他已經內嵌在VS.Net中了。 

 優點: 
VS.Net水晶報表有下面一些主要的優點: 
 快速的報表開發 
 能夠匯出成為複雜的互動性圖表 
 可以與其它控制元件一起在WebForm中使用 
 能夠動態地將報表匯出成為.pdf,.doc,xls,html,rtf等多種格式   
結構: 
 一些元件組成了水晶報表的二層結構,需要的Web應用有: 
 客戶端 : 
    客戶端僅需要一個可以訪問嵌入aspx頁面報表的遊覽器就可以了 
 伺服器 : 
      - 水晶報表引擎(Crystal Report Engine (CREngine.dll)) 
    通過它可以完成一些任務,如在報告檔案中合併資料,轉換報告為其它格式等。也正是因為報告引擎的作用,才可以將Asp.Net中的水晶報表轉換成為普通HTML格式 

    - 水晶報表設計器(Crystal Report Designer (CRDesigner.dll)) 
    水晶報表就是在設計器中建立的,在設計器中你可以設計標題,插入資料,公式,圖表,子報表等。 
     -  .rpt報表檔案 
    執行報表中的第一步就是在水晶報表設計器介面建立此報表,在預設安裝中微軟已經提供了一些現成的.rpt例子。 
     -  Data Source 
     .rpt檔案取得資料庫的方法取決於你方法的選擇,你能選擇讓水晶報表自己選擇資料而不使用任何程式碼或者也可以選擇手動的組裝DataSet,然後再將其傳送到報表檔案。 
    - 水晶報表檢視控制元件(Crystal Report Viewer web form Control (CRWebFormViewer.dll)) 

    水晶報表檢視控制元件是一個WebForm控制元件,可以將它看成是一個在.aspx頁面中存放報表的容器。  注意:在一些複雜的操作中,報表伺服器與Web伺服器可能不在同一物理主機上,Web伺服器將HTTP請求傳送到報表伺服器上去。水晶報表也可以當做WebService來執行。 
 執行模式 
水晶報表取資料可以使用下面的方法實現: 
- Pull 模式: 
 被請求時,水晶報表直接根據指定的驅動連線資料庫然後組裝這些資料。 
- Push 模式 : 
此時開發表不得不自己編寫程式碼連線資料並組裝DataSet,同時將它傳送至報表。在些這種情況下,通過使用連線共享以及限制記錄集合的大小,可以使用報表效能最大化。 
   報表型別: 
水晶報表設計器能夠直接包含報表至工程也能夠使用獨立的報表物件。 
- Strongly-typed 報表 : 
當你將報表檔案加入到專案中去時,它就變成了一個了“ strongly-typed“報表。在這些情況下,你將擁有直接建立報表的物件的權力,這將減少一些程式碼並且能夠提供一些效能。 
 - Un-Typed 報表 : 
這裡的報表並不直接包含在專案中,因此稱為‘un-typed’ 報表。在這種情況下,你不得不使用水晶報表的”ReportDocuemt“物件建立一個例項,並且”手動“地凋用報表。 
  其它注意事項 
-        儘管水晶報表檢視器擁有一些很酷的功能,如縮放、頁面導航等。但是他不提供列印功能,你不得不呼叫遊覽器的列印功能。 
-         VS.Net中的水晶報表如果沒有註冊,那麼它只能使用30次,30次後,”儲存“功能就不能再使用了。為了避免這個,你不是不在 http://www.crystaldecisions.com/這裡註冊此產品。 (好像不是這樣子的,不註冊也好像能用很長的時間,只是不能提供支援) 
-         預設安裝的水晶報表只能支援5個使用者,為了支援更多的使用者,你不得不在 http://www.crystaldecisions.com/中購買許可證。 

讓我們感受一下----在Asp.net中使用一個現成的水晶報表檔案 
  1) 從WebForm工具欄中拖動水晶報表檢視器控制元件(Crystal Report Viewer)至.aspx頁面中。   

2) 調出水晶報表檢視器控制元件的屬性視窗   
3) 點選[...]按鈕檢視"Data Binding"屬性,並彈出了DataBinding視窗。 
4)  從左邊的"Bindable屬性”區中選擇“Report Source” 
5) 選中"自定義繫結表示式"單選按鈕,在右邊的底部的視窗中指定.rpt檔案的檔名和路徑,例如:"C:\\Program Files\\Microsoft Visual Studio.NET\\Crystal Reports\\Samples\\Reports\\General Business\\World Sales Report.rpt",然後”確定“ 

注意:檔案”World Sales Report.rpt“檔案是在VS.Net安裝時建立的。如果你在安裝過程中指定了其它目錄,此時你最好確認一下路徑的正確性。 
上面的步驟中實際上是插入了下面這些程式碼至Asp.Net檔案中: 

以及: 

                  id="CrystalReportViewer1" 
                  runat="server" Width="350px" Height="50px" 
                  ReportSource=''> 

注意:在飛刀我的VS.Net正式版中自動生成的程式碼中ReportSource產生的樣式不是這樣子的,它是: 
  ReportSource="" 
這樣是錯誤的,會出現錯誤資訊,有兩處錯誤: 
必須按照使用本文介紹的格式來手動修改,這也算是VS.Net的一個Bug吧。 
6) 在Page_Load方法中呼叫DataBind方法。(程式碼為VB.Net) 
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    DataBind() 
End Sub 
7)儲存並編譯你的頁面。 現在,你就有一個內嵌水晶報表的WebForm頁面了。 
注意:實際開發中,一開始會出現無法訪問inetsrv目錄的錯誤,解決的辦法是改變其目錄的安全屬性,使User使用者有可寫的許可權。飛刀我發現.Net系統自已給出的解決方法是沒有用的,也可能是我使用的是Windows.Net作業系統的原因。

使用Pull模式 
我們將通過下面的這些步驟來通過Pull模式來執行水晶報表 
1.首先建立rpt檔案,並使用水晶報表設計介面設定一些必須的資料連線。 
2.拖放一個 CrystalReportViewer控制元件至aspx頁面,設定它的屬性指定我們上一步建立的.rpt檔案。 
3. 在程式碼中呼叫DataBind方法。 
建立 .rpt 檔案: 
1) 在右擊”解決方案遊覽器“,在彈出的選單中選擇”新增“--”新增新項“-->”Crystal Report”   
  
2) 在”Crystal Report 庫”中選擇”作為空白報表“單選按鈕,最後單擊“確定“。   
  
3)這裡將彈出水晶報表設計器。   
  
4) 右擊報表中的”詳細資料區”,選擇“資料庫”->“新增/刪除資料庫..." 
5) 在彈出的”資料庫專家“中,擴充套件”OLE DB(ADO)“選項,此時會彈出另外一個”OLE DB(ADO)“視窗。 
6) 在 "OLE DB (ADO)" 彈出視窗中,選擇 "Microsoft OLE DB Provider for SQL Server" 然後 "Next" 
  
7) 指定連線的資訊 
伺服器 : ASPCN (您的機器是什麼名字就寫什麼) 
使用者 ID: sa 
密碼: 
資料庫 : Pubs 
8) 單擊”Next“,最後單擊”Finish“按鈕。 
9) 這時你就能在”資料庫專家“視窗中看到我們選擇的資料庫。 
10) 擴充套件”Pubs“資料庫,擴充套件”表“,選擇”Stores“表並將其加到”選定的表“區中,單擊”OK"按鈕。 
   
11) 現在在”欄位資源瀏覽器“中就會在左邊”資料庫欄位“區中顯示你選擇的表,以及表中的欄位。 
12) 拖放需要的欄位進入報表的”詳細資料“區。欄位名將會自動出現在”頁首“區。如果你想修改頭部文字,則可以右擊”頁首“區中的文字,選擇”編輯文字物件“選項並進行編輯。 
  
13) 儲存,這樣我們就有了一個水晶報表檔案。 
建立 CrystalReportViewer 控制元件 
14) 回到前面的WebForm中,拖放一個Crystal Report Viewer控制元件到頁面中去。 
15) 調出Crystal Report Viewer控制元件的屬性視窗,選擇“DataBindings"區點選[...] 
16) ”Crystal Report Viewer 資料繫結視窗”中,在右邊的“可繫結屬性”中選擇”ReportSource“,並選擇右下角的“自定義繫結表示式”中指定.rpt檔案路徑。    
17) 此時你能夠從Crystal Report Viewer 控制元件中看到使用一些虛擬資料組成的報表檔案的預覽。 
  注意:在上面的例子中,CrystalReportViewer可以在設計時直接呼叫真實的資料,因為此時資料已經儲存。在這種情況下,設計時當沒有儲存資料時,他是不能顯示資料的。取而代這的是顯示一些虛擬的資料,只有在執行時才會選取真實的資料。 
Code Behind 程式設計 
18) 在Page_Load方法中呼叫DataBind方法。 
執行你的程式 
19) 建立並執行你的程式!   
  
您現在就可以直接在Web頁面中使用水晶報表內建的一些功能,如頁面導航,縮放等。 
[/HTML]


Asp.Net中使用水晶報表(下) 
www.dotnet8.com  2002-9-6  DotNet吧

[HTML]我們採用下面的幾步使用Push模式執行水晶報表: 
1. 設計一個DataSet 
2. 建立一個.rpt檔案同時將其指定給上一步建立的DataSet。 
3. 在aspx頁面中拖放一個CrystalReportViewer控制元件同時將其與前面的rpt檔案建立聯絡。 
4. 在程式碼中訪問資料庫並把資料存入DataSet 
5. 呼叫DataBind方法。 
 設計一個DataSet 
1) 右擊“解決方案瀏覽器”,選擇“新增”--“新增新項”-->“資料集” 
  
2) 從“伺服器資源管理器”中的“SQL Server”中拖放“Stores”表(位於PUBS資料庫中)。 
 

3) 此時在資料集中就會有一個Stores表的結構圖。 
  
- .xsd檔案中僅僅包含一個結構圖,但是不會有任何資料在裡面。 
建立 .rpt 檔案 : 
4) 使用上面的介紹過的方法建立此檔案,唯一的不同就是使用資料集來代替前面的直接連線資料。 
5)建立.rpt檔案之後,右擊“詳細資料”-->"新增/刪除資料庫“ 
6) 在”資料庫專家“視窗中,展開”專案資料“(代替以前的OleDb),展開“ADO.Net資料集”--"DataSet1“,選擇”Stores“表。 
7) 將”Stores"表新增到“選定的表”中,點選“OK” 
  
 

8) 使用PULL模式下的方法,建立一個WebForm 
建立一個Crystal Report Viewer 控制元件 
9) 建立一個Crystal Report Viewer 控制元件,並設定其屬性,此處與PULL模式下是一致的。 
Code Behind 程式碼: 
10) 在Page_Load方法中使用下面的子函式: 
VB.Net程式碼: 
    Sub BindReport() 
        Dim myConnection As New SqlClient.SqlConnection() 
        myConnection.ConnectionString= "server= (local)\NetSDK;database=pubs;Trusted_Connection=yes" 
        Dim MyCommand As New SqlClient.SqlCommand() 
        MyCommand.Connection = myConnection 
        MyCommand.CommandText = "Select * from Stores" 
        MyCommand.CommandType = CommandType.Text 
        Dim MyDA As New SqlClient.SqlDataAdapter() 
        MyDA.SelectCommand = MyCommand 
        Dim myDS As New Dataset1() 
       '這就是我們在設計模式上使用的DataSet     
        MyDA.Fill(myDS, "Stores")   
        '你不得不使用與你前面DataSet相同名字。 
        Dim oRpt As New CrystalReport1() 
         ' 水晶報表繫結 
        oRpt.SetDataSource(myDS) 
         ' 設定水晶報表的ReportSource 
        CrystalReportViewer1.ReportSource = oRpt 
    End Sub 
C#程式碼: 
private void BindReport() 

    string strProvider = "Server=(local);DataBase=pubs;UID=sa;PWD="; 
    CrystalReport1 oCR = new CrystalReport1(); 
    Dataset1 ds = new Dataset1(); 
    SqlConnection MyConn = new SqlConnection(strProvider); 
    MyConn.Open(); 
    string strSel = "Select * from Stores"; 
    SqlDataAdapter MyAdapter = new SqlDataAdapter(strSel,MyConn); 
    MyAdapter.Fill(ds,"stores"); 
    oCR.SetDataSource(ds); 
    this.CrystalReportViewer1.ReportSource = oCR; 

  
注意:在上面的程式碼中,你得注意一下oRpt是"Strongly Typed"的報表檔案。如果你需要使用"UnTyped"報表,你得使用ReportDocument物件,然後再呼叫報表檔案。 
 執行你的程式。 
11) 執行你的程式 
  
將報表檔案匯出成為其它格式

你能夠將報表檔案匯出成為下列格式: 
             1. PDF (Portable Document Format) 
1.                                 2. DOC (MS Word Document) 
2.                                 3. XLS (MS Excel Spreadsheet) 
3.                                 4. HTML (Hyper Text Markup Language – 3.2 or 4.0 compliant) 
4.                                 5. RTF (Rich Text Format)

使用Pull模式匯出報表 
當匯出使用Pull模式建立的檔案時,水晶報表準確地開啟所需要的資料,下面是執行匯出功能的程式碼: 
 C#程式碼: 
VB.Net程式碼: 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
        Dim myReport As CrystalReport1 = New CrystalReport1() 
      '注意:這裡我們建立一個strong-typed的水晶報表例項。 
        Dim DiskOpts As CrystalDecisions.Shared.DiskFileDestinationOptions = New CrystalDecisions.Shared.DiskFileDestinationOptions() 
        myReport.ExportOptions.ExportDestinationType = CrystalDecisions.[Shared].ExportDestinationType.DiskFile 
        ' 匯出成為其它檔案時也需要這個選項 
        ' 如Microsoft Exchange, MAPI等.        
        myReport.ExportOptions.ExportFormatType = CrystalDecisions. [Shared].ExportFormatType.PortableDocFormat 
        '這裡我們匯出成為.pdf格式檔案,你也能選擇上面的其它型別檔案 
        DiskOpts.DiskFileName = "c:\Output.pdf" 
        '如果你不指定確切的目錄,那麼檔案就會儲存到[Windows]\System32目錄中去了 
        myReport.ExportOptions.DestinationOptions = DiskOpts 
        '水晶報表檔案不包含直接的FileName屬性,因此你不能直接指定儲存的檔名 
        '所以你不得不使用DiskFileDestinationOptions物件,設定它的DiskFileName屬性 
        '為你想要的路徑,最後將水晶報表的DestinationsOptions屬性指定為上面的DiskFileDestinationOption 
        myReport.Export() 
        '上面的程式碼將完成匯出工作。 
End Sub 
  
使用PUSH模式匯出水晶報表 
當匯出的報表是由PUSH模式建立的時,第一步就是通過程式設計建立連線並組裝DataSet,設定報表的的SetDataSource屬性。再下面的步驟就有Pull模式一樣的了。

.NET環境下水晶報表使用總結

水晶報表是一個優秀的報表開發工具,本人在開發通用管理系統的時候,所有報表都使用水晶報表,其簡單、易用和強大的功能令筆者倍加喜愛,現將水晶報表使用手記呈現給大家。

一、在使用自帶的水晶報表時,請註冊,否則只能使用30次

水晶報表註冊碼 
註冊號:6707437608 
密碼:AAP5GKS0000GDE100DS

二、使用CrystalReportViewer進行預覽

CrystalReportViewer控制元件允許在應用程式中檢視 Crystal Report。ReportSource 屬性用於設定要檢視哪個報表。該屬性設定之後,報表顯示在檢視器中。報表源可以是ReportDocument、報表檔案的路徑,也可以是強型別報表。

1.      開啟“工具箱”,並將一個 CrystalReportViewer 拖到窗體上,我們命名為rptVew。

2.      通過拖放操作將 Windows 窗體檢視器調整到希望的大小並將其移動到所需位置。

3.      當執行應用程式時,報表將顯示在檢視器中。

三、建立新報表

1.      指向“新增”,單擊“新增新項”。

2.      在“新增新項”對話方塊中,從“模板”區域選擇 Crystal Report,將報表命名為rptClient,單擊“開啟”。

3.      在 Crystal Report 庫中,選擇下列選項之一:

·         使用報表專家 — 指導您完成報表的建立過程,並將您的選擇新增到 Crystal Report Designer。

·         作為空白報表 — 開啟 Crystal Report Designer。

·         來自於現有的報表 — 建立新報表,它與指定的另一報表設計相同。

注意   Crystal Report 庫包含許多專家,可以指導您完成數個特定型別報表的建立工作。您可能希望使用專家來建立最初的報表,以確定哪種報表構造方法適合您的需要。

4.      單擊“確定”按鈕。

如果選擇使用“報表專家”,便會出現“報表專家”對話方塊,並帶有資料資源管理器。為每個資料夾選擇所需資料,完成“報表專家”選項卡介面上的操作,然後單擊“完成”來訪問 Crystal Report Designer 和您的報表

四、是否需要動態設定資料來源?

Crystal Reports 通過資料庫驅動程式與資料庫連線。每個驅動程式都被編寫為可處理特定資料庫型別或資料庫訪問技術。

拉和推模型 
為了向開發人員提供最靈活的資料訪問方法,Crystal Reports 資料庫驅動程式被設計為可同時提供資料訪問的拉模型和推模型。

拉模型


在拉模型中,驅動程式將連線到資料庫並根據需要將資料“拉”進來。使用這種模型時,與資料庫的連線和為了獲取資料而執行的 SQL 命令都同時由 Crystal Reports 本身處理,不需要開發人員編寫程式碼。如果在執行時無須編寫任何特殊程式碼,則使用拉模型。

推模型


相反,推模型需要開發人員編寫程式碼以連線到資料庫,執行 SQL 命令以建立與報表中的欄位匹配的記錄集或資料集,並且將該物件傳遞給報表。該方法使您可以將連線共享置入應用程式中,並在 Crystal Reports 收到資料之前先將資料篩選出來。

四、從 ADO.NET 資料集製作報表

從資料庫建立資料集物件

1.      在專案中新建一個架構檔案:

a.      在解決方案資源管理器中,右擊專案名,指向“新增”,然後單擊“新增新項”。

b.      在“新增新項”對話方塊的“類別”區域,展開資料夾,然後選擇“資料”。

c.      在“模板”區域選擇“資料集”。

d.      接受預設名稱 Dataset1.xsd。

這就建立了一個新的架構檔案 (Dataset1.xsd),以後將用它來生成強型別資料集。該架構檔案將顯示在 ADO.NET 資料集設計器中。

2.      指定資料庫位置:

a.      在伺服器資源管理器中,右擊“資料連線”並選擇“新增連線”。

b.      在“資料鏈接屬性”對話方塊中,單擊“提供程式”選項卡,然後選擇一個提供程式(例如 Microsoft OLE DB Provider for SQL Server)。

c.      單擊“連線”選項卡,然後指定您的資料庫所在位置。在所需位置輸入伺服器和登入資訊。

d.      單擊“確定”按鈕。

此時,您的資料庫及其表和欄位就出現在伺服器資源管理器的“資料連線”節點下面。

3.      在解決方案資源管理器中,雙擊 Dataset1.xsd (如果它尚不是活動檢視)。

Dataset1.xsd 現在應顯示在“資料集”選項卡中。

4.      若要為資料集建立架構,請將需要的表從伺服器資源管理器中拖動到 Dataset1.xsd 的“資料集”選項卡上。

5.      單擊“儲存 Dataset1.xsd”來儲存“Dataset1.xsd”檔案。

6.      在“生成”選單上,單擊“生成”為專案生成資料集物件。

ADO.NET 資料集物件提供資料的描述,從它可以向 Crystal report 新增表。使用 Crystal Report Designer 中的“資料庫專家”從 ADO.NET 資料集物件新增表。

請在使用“報表專家”建立新報表時呼叫“資料庫專家”。或者,要從一個已經使用 ADO.NET 建立好的報表中訪問“資料庫專家”,請在 Report Designer 中右擊,指向“資料庫”,然後單擊“新增/刪除資料庫”。

將報表連線到 ADO.NET 資料集物件

1.      在“資料庫專家”中,展開“專案資料”資料夾。

2.      展開“ADO.NET 資料集”資料夾。

3.      選擇所需資料集物件。

例如,如果當時使用的是從專案“WindowsApplication1”的架構檔案“Dataset1.xsd”中生成的資料集物件,則應該選擇“WindowsApplication1.Dataset1”。

4.      選擇要向報表中新增的表,和使用其他資料來源一樣。

五、動態改變資料來源的程式碼

               Dim dsdataSet As New DataSet()

                Dim oRpt As New rptClient()   '已建立的報表rptClient

                請讀者自行填充資料集dsdataSet

                '使用“報表引擎”物件模型將填充的資料集,傳遞給報表

                oRpt.SetDataSource(dsdataSet.Tables(0))

                ' 將帶有資料的報表物件繫結到 Windows 窗體檢視器,rptVew(CrystalReportViewer控制元件)

                rptVew.ReportSource = oRpt

注意   FillDataSet 方法可連線到指定的資料庫,提取資料,然後斷開資料庫連線。如果您希望將資料庫中的多個表新增到報表中,請使用 SQL JOIN 語句將這些表聯接在一起;然後在 FillDataSet 方法中指定一個結果表

六、建立主從報表

在報表中,有許多報表是主從表結構,比如訂單與訂單商品明細,訂單是一個表中的一條記錄,而分錄是另一個表中的多條記錄,兩個表通過一個欄位關聯起來,這種報表可利用其分組功能實現,

1.      新建一個工程

2.      往FORM1中新增一個CrystalReportViewer控制元件

3.      在服務噐資源管理器中連線到SQL SERVER 2000上的Northwind資料庫

4.      新增一個數據集Dataset1,將伺服器資源管理器中的Orders和 Order Details加入到資料集中。

5.      新增一個水晶報表,使用報表專家,在專案資料中選擇“ADO.NET資料集”,插入表Orders和 Order Details,“連結”中是關聯欄位的連結,在“欄位”中選擇要顯示的主表和明細表的欄位,組中選擇分組依據為Orders表OrdersID欄位,總計,圖表,選擇(可進行篩選),樣式(可設定報表標題),可自行設定。設定完後,點選完成。

6.      在報表設計器中調整需要顯示的欄位的位置、寬度等。

7.      在視窗中新增程式碼。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim oRpt As New CrystalReport1()

        Dim dsdataSet As New Dataset1()

        Dim CN As New Data.SqlClient.SqlConnection("data source=PMSERVER;initial catalog=Northwind;user id=sa;password=sa")

        CN.Open()

        Dim daOrders As New Data.SqlClient.SqlDataAdapter("select * from orders", CN)

        daOrders.Fill(dsdataSet, "orders")

        Dim daDetails As New Data.SqlClient.SqlDataAdapter("select * from [Order Details]", CN)

        daDetails.Fill(dsdataSet, "Order Details")

        '使用“報表引擎”物件模型將填充的資料集,傳遞給報表

        oRpt.SetDataSource(dsdataSet)

        CrystalReportViewer1.ReportSource = oRpt

    End Sub

8、執行程式

七、用程式改變報表中text的文字

程式碼如下:

                Dim GetTextObject As TextObject

                ' 按名稱獲取 ReportObject,將其轉換為 TextObject,並返回此物件。

                GetTextObject = orpt.ReportDefinition.ReportObjects.Item("text13")

                GetTextObject.Text = "XXXX系統"

總結:水晶報表具有非常強大的功能,還可進行匯出WORD、EXCEL、RTF等檔案,還可生成複雜、漂亮圖表,是進行WEB和WINDOWS報表開發的利器。 
本人有如下設想:  
1、通過連線查詢獲得SQL資料庫相關資料;  
2、置放在DataSet裡;  
3、呼叫水晶報表(線形或柱形模板),生成報表;  
4、輸出生成EXCEL文件。  
  
請教各位大俠,如何實現以上思路?(如有範例就更好了)  
非常感謝!  
---------------------------------------------------------------  
  
1.在你的工程中新增新專案DataSet,連結資料庫,將需要的資料表或預存程式  
拖入此DataSet中,編譯DataSet  
2.使用Vs.net自帶的Crystal  Report,以DataSet為資料來源建立報表  
3.在程式中將資料推入此報表中  
4.Crystal  Report  有輸出為Excel的選項,通過程式也可以實現  
  
 Dim  conn  As  SqlConnection  
 Dim  da  As  SqlDataAdapter  
 Dim  strSQL  As  String  
  
 conn  =  New  SqlConnection()  
 conn.ConnectionString  =  "User  ID=sa;  PWD=1234;Data  Source=xxxx;  Initial  Catalog  =xxxxx"  
 conn.Open()  
  
 strSQL  =  "Select  *  from  TableName"            
 da  =  New  SqlDataAdapter(strSQL,  conn)  
 Dim  ds  As  New  DataSet()                                          
 da.Fill(ds,  "TableName")                                                
  
   Dim  RptDoc  As  New  ReportName()        
   RptDoc.SetDataSource(ds)                                              
 '  給RptDoc  指定資料,        
   CrystalView1.ReportSource  =  RptDoc            '給CrystalView指定資料  
   CrystalView1.DataBind()  
   conn.Close()  
5.如果需要顯示的為多表關聯的欄位,最好以儲存過程建立DataSet  
  
---------------------------------------------------------------  
  
請參考如下程式碼:  
                                   string  strconn=連線串;  
                                   SqlConnection  myconn=new  SqlConnection(strconn);  
                                   string  [email protected]"select語句";  
  
                                   SqlCommand  mycmd=new  SqlCommand(strcmd,myconn);  
                                   SqlDataAdapter  myda=new  SqlDataAdapter(strcmd,myconn);  
                                   DataSet  myds=new  DataSet();  
                                   myconn.Open();  
                                   myda.Fill(myds,"報表名");  
  
  
                                   報表名  myrpt  =new  報表名();  
                                   myrpt.SetDataSource(myds);  
                                   this.CrystalReportViewer1.ReportSource=myrpt;  
  
匯出到EXCEL:  
myrpt.ExportOptions.ExportDestinationType=CrystalDecisions.Shared.ExportDestinationType.DiskFile;  
myrpt.ExportOptions.ExportFormatType=CrystalDecisions.Shared.ExportFormatType.Excel;  
CrystalDecisions.Shared.DiskFileDestinationOptions  opt=new  CrystalDecisions.Shared.DiskFileDestinationOptions();  
[email protected]"檔名";  
myrpt.ExportOptions.DestinationOptions  =opt;  
myrpt.Export(); 
水晶報表9的中文幫助 下載: 
http://www.ourfly.com/download/download.aspx 
http://www.enwell.net/soft/ 
http://www.fast8.com/news.asp


Crystal Reports for Visual Studio .NET   

PictureObject 成員請參見 
PictureObject 類 ¦ CrystalDecisions.CrystalReports.Engine 名稱空間 
公共例項屬性 
Border(從 ReportObject 中繼承而來) Border。獲取 Border 物件。 
Height(從 ReportObject 中繼承而來) Int32。獲取或設定以緹為單位的物件高度。 
Kind(從 ReportObject 中繼承而來) ReportObjectKind。獲取報表物件的型別。 
Left(從 ReportObject 中繼承而來) Int32。獲取或設定以緹為單位的物件左上角位置。 
Name(從 ReportObject 中繼承而來) 字串。獲取物件名。 
ObjectFormat(從 ReportObject 中繼承而來) ObjectFormat。獲取 ObjectFormat 物件。  
Top(從 ReportObject 中繼承而來) Int32。獲取或設定以緹為單位的物件頂部位置。 
Width(從 ReportObject 中繼承而來) Int32。獲取或設定以緹為單位的物件寬度。

請參見 
PictureObject 類

Imports CrystalDecisions.CrystalReports.Engine

大家在基於webform中使用水晶報表時如果簡單的按照網上“阿刀”的做法,肯定會提示你:登陸失敗。 
對於這個問題,斑竹我花了整整一天的時間研究水晶報表的幫助檔案,終於得到解決方案。 
我不是一個保守的人,我相信有很多的網友正和我一樣在花費精力在研究這個問題,我不願意大家再和我一樣白白的花費精力。 
下面是我實現該方案的幾個步驟。大家不要著急,慢慢的看下去會對你有很大的幫助。 
步驟一:看示例檔案 
水晶報表自帶一個示例檔案,資料庫是access(不帶密碼的)。我首先執行示例檔案(基於webform和winform)結果顯示了正確的報表,正如“飛刀”的示例。 
於是,我自己建立了一個報表檔案和.aspx檔案,結果顯示登陸失敗!可是我把報表檔案換成示例的報表檔案,不再出錯。 
問題出在什麼地方?難道是報表格式檔案有關於登陸許可權的設定?通過跟蹤、除錯,我對比分析我的報表檔案和示例報表檔案,沒有發現任何的不同。看來問題不在報表檔案。 
是資料庫的問題?我建立一個access結果還是登陸失敗! 
不是資料庫的問題(我自己的資料庫是未帶密碼的access,幫助中的資料庫也是如此)?也不是報表格式檔案的問題(我仔細分析了兩者的原始碼是相同的)? 
那麼問題出現在什麼地方?我白思不得其解! 
步驟二:找幫助檔案 
於是我再次求助於幫助。我翻遍了水晶報表的幫助,終於找到“ 訪問安全資料庫 [C#]”字樣,發現這裡有下面的一段話: 
通過 Crystal Reports for Visual Studio .NET 訪問安全資料庫的過程在 Web 窗體和 Windows 窗體之間有所不同。在 Windows 窗體中,對話方塊自動提示使用者輸入使用者名稱和密碼(測試很容易成功)。而在 Web 窗體中,您需要設計一個表單以從使用者獲取該資訊。對於這兩種情況,均可使用程式碼來指定使用者名稱和密碼,從而為應用程式的所有使用者提供相同的安全等級。

於是我對同樣的資料庫(先是用幫助示例中的access資料庫,後來用自己建立的access資料庫)。發現對於同一個報表檔案,對於winform能顯示成功,而對於webform則仍然顯示登陸失敗!於是我有點明白上面的意思! 
看來問題是出在許可權的設定上。

步驟三:研究幫助,終於成功! 
在幫助裡我找到“設定資料庫登入引數”字樣,裡面提供了一些後來發現是非常有用的資訊: 
下列示例說明如何將登入引數傳遞到報表的表中。該示例使用到某個安全的 SQL Server 資料庫的連線。

啟動一個新專案 
向窗體新增一個“按鈕”和四個“文字框”控制元件。 
將“文字框”控制元件分別命名為:serverNameTxt、dbNameTxt、userNameTxt 和 passwordTxt。 
雙擊“按鈕”控制元件以指定 Click 事件的程式碼。根據所用語言插入適當的程式碼。 
[C#] 
// 宣告所需變數。 
TableLogOnInfo logOnInfo = new TableLogOnInfo (); 
int i = 0;

// 對報表中的每個表依次迴圈。 
for (i=0;i == Report.Database.Tables.Count - 1;i++) 

// 設定當前表的連線資訊。 
logOnInfo.ConnectionInfo.ServerName = serverNameTxt.Text; 
logOnInfo.ConnectionInfo.DatabaseName = dbNameTxt.Text; 
logOnInfo.ConnectionInfo.UserID = userNameTxt.Text; 
logOnInfo.ConnectionInfo.Password = passwordTxt.Text; 
Report.Database.Tables [i].ApplyLogOnInfo (logOnInfo); 

注意 受密碼保護的 Microsoft Access 和 Paradox 等 PC 資料庫也使用該方法,但 LogOnInfo.ServerName 和 LogOnInfo.DatabaseName 要保留為空。 
於是我仿照這個樣子,嘗試了一下,出錯提示:沒有發現TableLogOnInfo 和Report。 
後來我發現TableLogOnInfo 是屬於CrystalDecisions.Shared 名稱空間的成員。於是我新增引用: 
using CrystalDecisions.Shared ; 
這次問題出現在Report。 
Report?這是個什麼東西,我查遍了所有的幫助,並沒有這個函式或類! 
[說真的!這個問題難到了我很長的時間!一直在查詢Report到底是個什麼東西!水景報表公司也真是的,幫助也不寫得詳細一點!該打!!!] 
最終我終於發現Report只是一個使用者定義的物件,不是系統本身的物件。 
在我困惑的時候,突然我想,為什麼不看看Report後面的DataBase,這是個什麼東西,終於問題解決了,在幫助裡找到如下資訊 
ReportDocument oRpt = new ReportDocument(); 
Report屬於DocumentCrystalDecisions.CrystalReports .Engine 類的成員