[C#]使用資料庫內儲存的圖片做報表

資料庫中儲存的圖片資料為byte型態的陣列資料,要如何加入rdlc檔中做出報表。

加入DataSet
在此使用DataSet代替資料庫,作為報表的資料來源。
加入DataSet的檔案,取名為「ds.xsd」。

編輯ds.xsd檔
資料表重新命名為「MainTable」,右鍵加入2個資料行,
資料行1命名為「ID」作為編號,
資料行2命名為「Img」存放圖檔。

加入rdlc檔
rdlc檔命名為「Report1.rdlc」。
在rdlc檔畫面下,點選「檢視」內的「ReportData」開啟「報表資料」。

在「報表資料」中的「資料集」,右鍵點選「加入資料集」。

名稱改為「MainTable」,資料來源選「ds」,資料集選「MainTable」。

在「Report1.rdlc」中,
右鍵加入「清單」,清單是可以連續列出多筆資料的容器。
右鍵加入「文字方塊」,預計用來顯示編號。
右鍵加入「影像」,預計用來顯示圖片。
再將「文字方塊」和「影像」放入「清單」內。



設定「文字方塊」
右鍵「文字方塊」選擇「運算式...」。
於「類別目錄」中選擇「欄位」。
」:雙擊選擇「ID」欄位,用於顯示編號資料。

設定「影像」
右鍵「影像」選擇「影像屬性...」。
於「一般」項目:
選取影像來源」:選擇「資料庫」。
使用此欄位」:進入運算式,雙擊選擇「Img」欄位。
使用此MIME類型」:選擇「image/jpeg」(考慮原圖檔為jpg檔)。

於「大小」項目:
選擇「依比例調整」。

加入ReportViewer元件
從工具列拖拉,在form1視窗中放入「ReportViewer」,
用來顯示rdlc檔所設計的報表。

準備測試資料
撰寫函式取得測試資料表,模擬從資料庫取得的資料表,如下:

//製作2筆測試資料,傳回DataTable。
private DataTable GetDataTable()
{
   DataTable dt = new DataTable();
   dt.Columns.Add("ID", typeof(int)); //ID欄位設定為int型態。
   dt.Columns.Add("Img", typeof(byte[])); //Img欄位必須為byte[]型態。

   DataRow newrow = dt.NewRow();
   newrow["ID"] = 1;
   newrow["Img"] = GetPhotoToBytes("p1.jpg"); //p1.jpg放在debug資料夾內。
   dt.Rows.Add(newrow);

   newrow = dt.NewRow();
   newrow["ID"] = 2;
   newrow["Img"] = GetPhotoToBytes("p2.jpg"); //p2.jpg放在debug資料夾內。
   dt.Rows.Add(newrow);

   return dt;
}


//將圖檔轉成byte陣列。
private byte[] GetPhotoToBytes(string photoPath)
{
   byte[] bytes;

   using (Bitmap bmp = new Bitmap(photoPath))
   using (MemoryStream ms = new MemoryStream())
   {
      bmp.Save(ms, ImageFormat.Png);
      bytes = new byte[(int)ms.Length];
      ms.Position = 0;
      ms.Read(bytes, 0, (int)ms.Length);
      ms.Flush();
   }

   return bytes;
}


設定ReportViewer
在Load事件下,撰寫程式來初始化和設定ReportViewer。

private void Form1_Load(object sender, EventArgs e)
{
   reportViewer1.LocalReport.ReportPath = "Report1.rdlc"; //使用相對路徑
   ReportDataSource rds = new ReportDataSource("MainTable", GetDataTable());
   reportViewer1.LocalReport.DataSources.Add(rds);
   reportViewer1.RefreshReport();
}
由於上述程式碼設定Report1.rdlc路徑為相對路徑,其檔案必須在編譯完成的exe檔資料夾中(debug或release資料夾中),因此,rdlc檔的屬性「複製到輸出目錄」:必須設定為「一律複製」。


完成