Microsoft.ReportViewer.WebForms (Ver.10.0)
Microsoft.ReportViewer.Common (Ver.10.0)
※ 注意,ReportViewer 版本要選 10.0
System.Web (Ver 2.0)
System.Web.Extensions (Ver 3.5)
02.建立一個空白報表,取名為 Report1.rdlc。
03.建立一個 DataSet,取名為 dsTest.xsd
04.在 dsTest.xsd 建立一個查詢。選擇 Add → TableAdapter
建立一個新的 DB 連線資訊。
這裡是說,剛剛的連線字串因為有帳號密碼,屬於敏感資料,是否要在連線資訊裡顯示,選擇「是」。
針對剛剛的連線,取個名字。
這裡只是做個簡單的查詢指令,然後可以直接按「Finish」來完成。
存檔後,先重先編譯一下專案。Build → ReBuild Solution。
05.回到 Report1.rdlc。到 ReportData ,如果看不到 ReportData,則到 View → Report Data 可以找到。
選擇 New→DataSet
在 Data Source 挑選 dsTest,然後點選 「OK」
將 DataSet1 的 CustCName 拖拉到 報表 內文中,然後存檔。
有個小地方別忘了,就是將 Report1.rdlc 屬性裡的 Copy to Output Director 設為 「Copy Always」。這樣,當程式被編譯時,自動會將報表複製到 BIN 資料夾。
06. 參考了這篇「[C#]透過ReportViewer將報表另存成檔案」,將 Program.cs 程式改寫如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Reporting.WebForms; using System.Data.SqlClient; using System.Data; using System.IO; class Program { static void Main(string[] args) { ExportReport("PDF"); } public static void ExportReport(string pType) { Microsoft.Reporting.WebForms.Warning[] tWarnings; string[] tStreamids; string tMimeType; string tEncoding; string tExtension; // Setup the report viewer object and get the array of bytes ReportViewer viewer = new ReportViewer(); viewer.ProcessingMode = ProcessingMode.Local; viewer.LocalReport.ReportPath = "Report1.rdlc"; string DBConnection = @"DATABASE=CarISC;Server=140.11.1.1,5555;User ID=account;Password=pwd"; string sql = @"select top 1 * from Customer"; SqlConnection conn = new SqlConnection(DBConnection); SqlCommand SqlCmd = new SqlCommand(sql, conn); SqlDataAdapter adapter = new SqlDataAdapter(SqlCmd); DataSet ds = new DataSet(); conn.Open(); adapter.Fill(ds); conn.Close(); DataTable tDt = ds.Tables[0]; viewer.LocalReport.DataSources.Clear(); viewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("DataSet1", tDt)); viewer.LocalReport.Refresh(); //呼叫ReportViewer.LoadReport的Render function,將資料轉成想要轉換的格式,並產生成Byte資料 byte[] tBytes = viewer.LocalReport.Render(pType, null, out tMimeType, out tEncoding, out tExtension, out tStreamids, out tWarnings); //將Byte內容寫到Client using (FileStream fs = new FileStream(@"D:\ProjTest\MyTest.pdf", FileMode.Create)) { fs.Write(tBytes, 0, tBytes.Length); fs.Close(); } } }
這樣,就能夠產生報表了(位於 D:\ProjTest\MyTest.pdf)。
在測試過程中,曾經發生「報表定義具有無效的目標命名空間 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition'」這錯誤,經過「RDLC命名空间引用错误的解决方法」的介紹,發現是自己所參考的Microsoft.ReportViewer.WebForms 版本錯誤所致,所以在引用參考時,要選對版本。
後記:
以上測試程式的環境為 .Net FrameWork 3.5,我在 .Net FrameWork 2.0 發現找不到參考 「Microsoft.ReportViewer.WebForms」,但卻有 「Microsoft.ReportViewer.WinForms」。於是我改成參考 「Microsoft.ReportViewer.WinForms」,也可以成功。
只是要多參考一個:「System.Windows.Forms」
而 progarm.cs 有兩處要修改:
1. Microsoft.Reporting.WebForms.Warning[] tWarnings;
改成
Microsoft.Reporting.WinForms.Warning[] tWarnings;
2.viewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("DataSet1", tDt));
改成
viewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", tDt));
補充:
01:如果有需要合併多張報表,可參考「LocalReport 報表合併後變成空白」。
參考:
01:[C#]透過ReportViewer將報表另存成檔案
02:如何製作LocalReport-進階版(下)
03:如何製作LocalReport-簡易版(上)
04:Rendering RDLC to pdf output console application
05:RDLC命名空间引用错误的解决方法
沒有留言:
張貼留言