我們知道,在VS.NET2003下提供了Crystal Report報表,它功能強大,但是它是要收費的。現在,在VS.NET2005中我們有了另外一個選擇,而且它是完全免費使用的,那就是RDLC報表。下面,就讓我們一起來享受這份免費的大餐吧。
[一、認識RDLC報表]
RDLC的英文全稱是Report Definition Language Client-side processing,Client-side processing強調了它的客戶端處理能力。RDLC報表基於報表定義 ,它是一個說明數據和佈局的XML文件,使用報表定義語言編寫。VS.NET2005提供了設計和使用這種報表的能力,Microsoft將這種報表的後綴定爲RDLC。
相對於Crystal Report,它的功能並不遜色:
- 在WinForm和WebForm中都可以使用;
- 豐富的控件可以滿足各種報表樣式的需要;
- 強大的數據處理能力,在報表中就可以對數據進行分組、排序、篩選;
- 使用方便。不需要安裝額外的軟件,通過控件就可以輕鬆的實現導出Excel、PDF;
- 用XML描述報表,使通用成爲可能;
[二、活用RDLC報表]
下面,我們通過一個實例來介紹如何在WinForm中使用RDLC報表中“表”控件來實現多層報表樣式。希望能幫大家達到活用的目的。
1。定義數據源
首先創建一個Visual C#的“Windows應用程序” 項目(ReportTest),然後選擇菜單“數據”—“添加新數據源”。在打開的“數據源配置嚮導”中選擇“數據庫”,單擊下一步。在“選擇你的數據連接”頁中,筆者選擇的是SQL server 2000下的Northwind數據庫,單擊下一步。然後在“選擇數據庫對象”頁中,選擇表“Orders”,最後單擊“完成”按鈕,添加的數據源如圖1所示。
2。添加報表
選擇菜單 “添加新項”,打開“添加新項”對話框。選擇“報表”圖標,輸入名稱,單擊“添加”按鈕,將打開報表設計器。在工具箱中雙擊“表”控件,將“數據源”窗口中的OrderID字段拖至表的“詳細信息”行的第一列,可以看到詳細信息單元格顯示的是字段表達式“=Fields!OrderID.Value”,並且表頭行自動放置了標題,默認是字段名。依次在其他單元格放上相應字段,結果如圖2所示。
3。設置字段格式
右鍵單擊包含 OrderDate 字段表達式的單元,在彈出菜單中選擇“屬性”。 在“格式”選項卡單擊“格式代碼”後的第2個按鈕,打開“選擇格式”對話框。爲OrderDate 字段選擇合適的格式(如圖3),單擊“確定”即可。
4。添加分組
組可以用來顯示遞歸層次結構,比如顯示每個客戶(Customer)對應的訂單(Order)。
單擊選中表,在“詳細信息”行最左邊單擊右鍵,在彈出菜單中選擇“插入組”。 在“常規”選項卡上的“分組方式”框中,在第一行選擇“=Fields!CustomerID.Value”,如圖4所示,這將按照CustomerID對數據進行分組。最後單擊“確定”, 表中將添加組頭和組尾兩個新行。
5。設置詳細信息排序方式
單擊選中表,在表的左上角單擊右鍵,在彈出菜單中選擇“屬性”,打開“表屬性”對話框。在“排序”選項卡上的“排序方式”框中,在第一行選擇 “=Fields!OrderDate.Value”,在第二行選擇 “=Fields!OrderID.Value”,排序方式設爲先按“日期”降序排列,然後再按“訂單號”升序排列,如圖5所示。
在上面分組屬性對話框中同樣可以設置組的排序方式。
6。添加公式
爲了計算每個Customer的訂單數。右鍵單擊組尾的第一個單元格,在彈出菜單中選擇“表達式”,在“編輯表達式”對話框的上部書寫表達式“=Count(Fields!OrderID.Value)”。如果不太清楚公式的含義,可以在下方的類別樹中選擇,“說明”窗口會有相應的提示,如圖6所示。
7。顯示報表
VS.NET2005提供了一個專門的ReportViewer控件用來顯示RDLC報表。在Form1上添加一個button控件和一個ReportViewer控件。在button控件的Click事件中編寫如下代碼:
private void button1_Click(object sender, EventArgs e)
{
//設置數據源
reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("NorthwindDataSet_Orders", LoadData()));
//設置報表
reportViewer1.LocalReport.ReportEmbeddedResource = "ReportTest.Report1.rdlc";
this.reportViewer1.RefreshReport();
}
這裏沒有使用最開始綁定的數據源,而是用LoadData函數設置數據,這樣的好處是如果修改了數據源,比如從Access轉到SQL server,報表不需要做任何修改,但必須保證數據源架構相同。代碼如下:
private DataTable LoadData()
{
SqlConnection con = new SqlConnection("Data Source=servername;Initial Catalog=Northwind;Integrated Security=True");
SqlCommand cmd = new SqlCommand("select * from orders where orderdate>='1998/01/01' order by customerid", con);
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adp.Fill(ds);
return ds.Tables[0];
}
因爲報表的“生成操作”屬性默認是“嵌入的資源”,所以需要設置ReportEmbeddedResource屬性,如果是使用外部文件,代碼如下:
reportViewer1.LocalReport.ReportPath = "Report1.rdlc";
最後的效果如圖7所示,怎麼樣,效果不錯吧?
(刊登於 電腦報2006/09/11 第36期)