程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Asp.Net中使用水晶報表

Asp.Net中使用水晶報表

編輯:.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操作系統的原因。
  
  
  
  
  ASP.Net中使用水晶報表(中)
  www.dotnet8.com 2002-9-6 DotNet吧
  
  以下內容為程序代碼:
  使用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]我們采用下面的幾步使用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模式一樣的了。
  [/Html]
  .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報表開發的利器。
  
  
  
  (此文部分資料來自MSDN)
  
  Author:李洪根
  
  E-MAIL:[email protected]
  
  本人有如下設想:
  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 strcmd=@"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();
  opt.DiskFileName=@"文件名";
  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
  
   Dim picObject As PictureObject
   picObject = oRpt.ReportDefinition.ReportObjects.Item("picture1")
  
  
  來自:http://expert.csdn.Net/Expert/topic/1896/1896874.XML?temp=.78677
  
  大家在基於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 類的成員。
  修改代碼:並添加引用
  using CrystalDecisions.Shared ;//負責解釋TableLogOnInfo類
  using CrystalDecisions.CrystalReports .Engine ;//負責解釋ReportDocument類private void Page_Load(object sender, System.EventArgs e)
  {
  TableLogOnInfo logOnInfo = new TableLogOnInfo ();
  //這裡必須事先申明一個ReportDocument對象 Report,同時加載數據報表
  ReportDocument oRpt = new ReportDocument();
  oRpt.Load("c:\\inetpub\\wwwroot\\exer\\pagelet\\crystal\\cr1.rpt");//修改為你自//己的正確位置
  
  //建立安全信息
  //受密碼保護的 Microsoft Access 和 Paradox 等 PC 數據庫也使用該方法,但 LogOnInfo.ServerName //和 LogOnInfo.DatabaseName 要保留為空
  logOnInfo.ConnectionInfo.ServerName = "www";
  logOnInfo.ConnectionInfo.DatabaseName = "archives";
  logOnInfo.ConnectionInfo.UserID = "sa";
  logOnInfo.ConnectionInfo.PassWord = "123456";
  
  oRpt.Database .Tables [0].ApplyLogOnInfo (logOnInfo);
  
  //建立.rpt文件與CryStalReportvIEwer文件之間的連接
  CrystalReportVIEwer1.ReportSource = oRpt;
  }
  報表文件終於出現!
  哇,我好高興,禁不住站起來伸了個懶腰! 
   
  步驟四:最終的完整版的代碼
  上面的代碼不具有系統可擴充和靈活性。缺點有二:
  (1)、數據報表格式文件是采用絕對路徑
  (2)、數據庫訪問權限的設置一旦設定,在最終發布是無法修改的,特別是客戶的SQL Server服務器不可能和你調試的程序環境是一樣的
  基於這個考慮。引進兩個比較好的東西:
  (1)、Server.Mappath函數
  (2)、讀取web.config(本示例同時告訴你如何操作web.config配置文件)
  最終修改如下:(完整代碼)數據庫為SQL Server2000
  using CrystalDecisions.Shared ;//負責解釋TableLogOnInfo類
  using CrystalDecisions.CrystalReports .Engine ;//負責解釋ReportDocument類
  
  private void Page_Load(object sender, System.EventArgs e)
  {
  TableLogOnInfo logOnInfo = new TableLogOnInfo ();
  //這裡必須事先申明一個ReportDocument對象 Report,同時加載數據報表
  ReportDocument oRpt = new ReportDocument();
  //獲取.rpt文件真實路徑
  string path1,path2;
  path1=Server.MapPath ("\\exer\\pagelet");
  path2=path1+"\\crystal\\cr1.rpt";
  //oRpt.Load("c:\\inetpub\\wwwroot\\exer\\pagelet\\crystal\\cr1.rpt");
  oRpt.Load (path2);
  
  //從web.config中獲取logOnInfo參數信息
  string a,b,c,d;
  //獲取ServerName
  a=System.Configuration .ConfigurationSettings .APPSettings ["servername"];
  //獲取DatabaseName
  b=System.Configuration .ConfigurationSettings .APPSettings ["database"];
  //獲取UserId
  c=System.Configuration .ConfigurationSettings .APPSettings ["userid"];
  //獲取passWord
  d=System.Configuration .ConfigurationSettings .APPSettings ["pass"];
  //設置logOnInfo參數
  logOnInfo.ConnectionInfo.ServerName = a;
  logOnInfo.ConnectionInfo.DatabaseName = b;
  logOnInfo.ConnectionInfo.UserID = c;
  logOnInfo.ConnectionInfo.PassWord = d;
  
  oRpt.Database .Tables [0].ApplyLogOnInfo (logOnInfo);
  
  //建立.rpt文件與CryStalReportvIEwer文件之間的連接
  CrystalReportVIEwer1.ReportSource = oRpt;
  } 
   
   
  整個演示的操作過程說明:
  1、 在解決方案資源管理器裡,你需要存放報表文件處,添加新項:CrystalReport報表,起名為cr1.rpt
  2、 在隨後出現的“報表專家”中選擇數據源時,請務必選擇OLE DB,然後根據你的數據庫的要求選擇響應的驅動引擎:
  SQL SERVER:Microsoft OLE DB Provider for SQL Server
  Access:Microsoft Jet.4.0
  3、 輸入正確的數據庫連接,這一步大家一般的情況下不會出錯!
  4、 建立數據報表,並保存cr1.rpt文件
  5、 打開webform1.ASPx。添加crystalreportviewer控件:名稱為:CrystalReportVIEwer1
  6、 在webform1.ASPx.cs中的page_load事件中添加上面的代碼:
  (注意:引用千萬不要忘了!)
  
  
  *****************************************************
  下面是web.config中與本內容有關的細節
  <aPPSettings>
  <add key="servername" value="www"/>
  <add key="database" value="archives"/>
  <add key="userid" value="admin"/>
  <add key="pass" value="123456"/>
  </aPPSettings>
  
  
  ***注意這裡的<add key="pass" value="123456"/>是pass,所以他必須與
  //獲取passWord
  d=System.Configuration .ConfigurationSettings .APPSettings ["pass"];這裡
  的APPSettings["pass"] 中的"pass"保持一致。 當然名字是可以隨便起,但必須一致
  http://www.cnblogs.com/zhangyd1080/archive/2006/11/15/561770.Html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved