2013年9月24日 星期二

在 RDLC 報表連結外部圖片

使用 RDLC 產生本地端報表時,如果需要動態地更換圖片,那該怎麼辦呢?例如根據不同的使用者就會對應不同的照片。這時候,如果可以讓我們在 .cs 裡面設定報表要連結的外部圖片檔,應該就可以完成了。



以下介紹一種透過程式就可以手動去設定報表所連結外部圖片的方法。

Step 1:先建立一個報表,並設定一個參數,用來接收我們動態指定的檔案路徑。在這裡,我新增了一個 ImgPath 的參數。



Step 2 :在報表設計畫面,拉一個 Image 物件,然後在 Image 物件的屬性裡,將 Select the image source 的選項選擇「External」,表示接下來的圖片是來自於外部的圖片檔。


 Step 3:比較重要的,就是設定 Use this image 的地方。在此點選 fx。然後在運算式裡面寫
="file:///" & Parameters!ImgPath.Value
因為我打算使用存放在 IIS 站台上的磁碟目錄,所以這裡使用 file:/// 為開頭,後面接著的則是圖片檔所在的路徑,也就是先前在設計報表一開始時我們所加入的參數 ImgPath。


Step 4:把注意力拉回 aspx 頁面。我在 WithImg.aspx 頁面拉進來一個 ReportViewer,當然,別忘了順便拉一個 ScriptManager 在頁面上方,否則會出現下面錯誤訊息:

The Report Viewer Web Control requires a System.Web.UI.ScriptManager on the web form.


在 ReportViewer 所要注意的,是要在他的 LocalReport 屬性裡,找到 EnableExternalImages 設定,並將它設為 True。否則會出現下面的錯誤訊息:

Report 'RDLImg' contains external images. The EnableExternalImages property
has not been set for this report.


Step 5:最後,在 .cs 檔裡完成報表參數傳遞的程式。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        this.ReportViewer1.LocalReport.DataSources.Clear();

        //指定 ReportViewer 的報表路徑
        this.ReportViewer1.LocalReport.ReportPath = Server.MapPath("RDLImg.rdlc");

        //宣告要傳入報表的參數 p_ImgPath,並指定我的照片路徑是存放於 D:\\upload\\duck.jpg
        Microsoft.Reporting.WebForms.ReportParameter p_ImgPath = new Microsoft.Reporting.WebForms.ReportParameter("ImgPath", "D:\\upload\\duck.jpg");

        //把參數傳給報表
        ReportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WebForms.ReportParameter[] { p_ImgPath });

        //更新頁面上的報表
        this.ReportViewer1.LocalReport.Refresh();
    }

}


程式執行後的結果就會如下:

這時,我好奇的想瞭解,那將這 ReportViewer 匯出回 Excel、PDF、Word 時,這圖片還會在嗎?還好,還在!還好,還在。


參考:
01:External Images
02:如何在RDLC中顯示本機的圖檔
03:RDLC Report Viewer Control - How to open images in another window/tab

1 則留言: