2016年5月3日 星期二

使用 VS2010 在 Console Application 下 產生 LocalReport

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命名空间引用错误的解决方法

沒有留言:

張貼留言