01.增加參考。包含
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 連線資訊。
這裡是說,剛剛的連線字串因為有帳號密碼,屬於敏感資料,是否要在連線資訊裡顯示,選擇「是」。
針對剛剛的連線,取個名字。
挑選要查詢的方式,因為待會要自己寫 SQL,所以選「Use SQL statements」
這裡只是做個簡單的查詢指令,然後可以直接按「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命名空间引用错误的解决方法