我们知道,在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,它的功能并不逊色:
l 在WinForm和WebForm中都可以使用;
l 丰富的控件可以满足各种报表样式的需要;
l 强大的数据处理能力,在报表中就可以对数据进行分组、排序、筛选;
l 使用方便。不需要安装额外的软件,通过控件就可以轻松的实现导出Excel、PDF;
l 用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期)