最近接到的案子是用.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.Engine跟CrystalDecisions.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()
將
‘顯示於網頁
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, 否則會出現” 拒絕存取報表檔。其他程式可能正在使用該檔案”錯誤
因為我的OS是XP, 如果登入者非網域帳號時, 在設定資料夾權限時會找不到”安全性”頁籤, 此時要進"控制台-->資料夾選項-->檢視à將”使用簡易檔案共用(建議選項)”前方的打勾勾掉不要選, 頁籤就會出現了
如果出現” 匯出 DLL 偵測到錯誤” , 可能是OS修補檔SP2的問題, 可以參照JOHOYA的作法, 將C:Program FilesCommon FilesCrystal Decisions1.0Bin底下的ExportModeller.dll(9.1.1 .527版) 換成9.1.1.528版
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()
資料來源