2009-10-08 16:52:57nut

工作筆記_水晶報表使用法

最近接到的案子是用.NET 2003+Crystal Report, 用水晶報表不是第一次了,

這次把所學到讀到的筆記整理下來, 讓之後的自己可以參考

當然, 也謝謝敎我, 幫我debug的同事b大囉

 

建立步驟:

1.      建立水晶報表的模板

在專案中按右鍵à加入新項目à Crystal Reportà加入一個空白報表, 並設計出自己想要的格式

2.      建立資料集

在專案中按右鍵à加入新項目à資料集à加入一空白資料集

點進該資料集, 將報表所要顯示的資料表結構定義在此(最簡單的方法即是利用伺服器總管, 直接拖拉出想要的資料表結構定義, 再慢慢調整)

 

資料集中的皆只是資料結構定義, 非實體的資料, 用處在於將此資料定義放入水晶報表的模板中, 實體的資料會在程式中即時run出來

3.      在水晶報表中放置資料欄位

回到水晶報表, 點開後, 在左方的欄位總管定義該報表的資料來源為2.的資料集(如下圖一, )

作法: 按右鍵à新增/移除資料庫, 更多的資料來源àADO.NET(XML)à建立新的連結 按兩下, 會跳出一視窗讓我們輸入XML檔路徑, 在此輸入2.做好的XSD檔的路徑

 

部落格專用相簿




選好後, 該節點下就有剛資料集的資料, 如果該資料集有多個資料表也可以在此看到, 選取所要顯示在報表上的資料表並移到右邊的選取的資料表方框, 按下確定

 

做好後, 資料庫欄位節點下就會顯示出剛剛連好的資料集, 我們就可以使用該資   料集下的欄位囉(用法:直接將要顯示的欄位拖拉至報表中所想要顯示的位置)

 

做好後, 資料庫欄位節點下就會顯示出剛剛連好的資料集, 我們就可以使用該資料集下的欄位囉(用法:直接將要顯示的欄位拖拉至報表中所想要顯示的位置)

4.      AP中寫程式連結報表

再網頁中拖拉進一個CrystalReportViewer跟一個DataGrid

Page_Loa中寫下列程式連結報表

(要先引入CrystalDecisions.CrystalReports.EngineCrystalDecisions.Shared這兩個命名空間)

Dim myconn As SqlConnection = New  SqlConnection("Server=SERVER;Database=DB;UID=User;PWD=;")

        Dim cmd As New SqlCommand

        Dim conn As String

        myconn.Open()

        '先將資料撈出顯示於Gridview

        Dim sql As String

        sql = "Select UserID from TSUser where UserId <='008'"

        cmd.CommandText = sql

        cmd.Connection = myconn

        Dim ds As New DataSet

        Dim adp As New SqlDataAdapter

        adp.SelectCommand = cmd

        adp.Fill(ds)

        Me.DataGrid1.DataSource = ds

        Me.DataGrid1.DataBind()

        '將資料顯示於水晶報表

        Dim MyReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

        MyReport.Load(Server.MapPath("CrystalReport2.rpt"))

        Dim i As Integer

        MyReport.Database.Tables.Item(0).SetDataSource(ds.Tables(0))

        Me.CrystalReportViewer1.DisplayGroupTree = False

        Me.CrystalReportViewer1.ReportSource = MyReport

        Me.CrystalReportViewer1.DataBind()

5.      存檔, 執行

就會發現報表已順利產生出來囉

 

6.      將報表轉成EXCEL

      程式寫法:

  ‘顯示於網頁
        Me.CrystalReportViewer1.DisplayGroupTree = False
        Me.CrystalReportViewer1.ReportSource = MyReport
        Me.CrystalReportViewer1.DataBind()
換成
'輸出成EXCEL
Dim diskOpts As CrystalDecisions.Shared.DiskFileDestinationOptions = New         CrystalDecisions.Shared.DiskFileDestinationOptions
MyReport.ExportOptions.ExportDestinationType = CrystalDecisions.Shared.ExportDestinationType.DiskFile
MyReport.ExportOptions.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.Excel
'設置磁碟選項
diskOpts.DiskFileName = "D:rpt_testcoffee_rpt.xls"
MyReport.ExportOptions.DestinationOptions = diskOpts
MyReport.Export()

寫入EXCEL, 資料夾權限部分要設定,將網站資料夾的「安全性」開放給ASPNET, 否則會出現 拒絕存取報表檔。其他程式可能正在使用該檔案錯誤

因為我的OSXP, 如果登入者非網域帳號時, 在設定資料夾權限時會找不到安全性頁籤, 此時要進"控制台-->資料夾選項-->檢視à使用簡易檔案共用(建議選項)”前方的打勾勾掉不要選, 頁籤就會出現了

如果出現 匯出 DLL 偵測到錯誤” , 可能是OS修補檔SP2的問題, 可以參照JOHOYA的作法, C:Program FilesCommon FilesCrystal Decisions1.0Bin底下的ExportModeller.dll(9.1.1.527) 換成9.1.1.528

(我測試的結果是, 就算是改成英文語系, 灌了修補檔, 那個9.1.1.528版的ExportModeller.dll還是出不來, 無法只好去網路上下載)

 

P.S.水晶報表模版也可以直接連資料庫

如果直接連的話, 就要在程式中再指定資料庫連線字串

但這樣的作法只能直接撈出該資料表所有的資料, 無法照自己的意思只顯示自己要的資料

        '將資料顯示於水晶報表

        Dim MyReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

        Dim logOnInfo As New CrystalDecisions.Shared.TableLogOnInfo ‘連結資料庫

        MyReport.Load(Server.MapPath("CrystalReport2.rpt"))

        Dim i As Integer

       指定資料庫連結資料

        logOnInfo.ConnectionInfo.ServerName = "ServerName"

        logOnInfo.ConnectionInfo.DatabaseName = "DatabaseName"

        logOnInfo.ConnectionInfo.UserID = " UserID"

        logOnInfo.ConnectionInfo.Password = " Password "

        MyReport.Database.Tables.Item(0).ApplyLogOnInfo(logOnInfo)

        Me.CrystalReportViewer1.DisplayGroupTree = False

        Me.CrystalReportViewer1.ReportSource = MyReport

        Me.CrystalReportViewer1.DataBind()