在这篇随笔中,我主要分析一下GotReportViewer上的几个经典例子,我们可以从中看到ReportViewer Control的强大功能:

1、Web Log Analyzer

这是一个比较典型的OLAP应用,我们可以看到RDLC报表强大的Chart和Navigation功能。当然了,例子中解析W3C标准日志文件的代码也非常有借鉴意义。这个Starter Kit在我的随笔http://waxdoll.cnblogs.com/archive/2006/01/19/320280.html中曾经提到过,不再详述。

2、子报表

展示如何使用子报表显示主记录的详细信息,这种应用很像Access中的子报表功能。主要使用SubreportProcessing事件为子报表提供数据。

3、钻取报表

钻取报表是通过设置Navigation(HyperLink)和Parameters来实现的,通常在OLAP应用程序中很有用。

4、具有子报表的钻取报表

这个例子实现的功能类似Excel中数据透视表(Pivot Table)的功能,在一个复杂的交叉表中可以进行时间和商品两个维度的向下钻取。这在别的报表中恐怕是很难实现的。如图所示,


5、引用外部代码块

 

此示例演示从另外一个类Util中读取函数返回值到报表中:首先,使用LocalReport的AddTrustedCodeModuleInCurrentAppDomain方法允许Util类中的方法在Report Viewer中执行,然后在报表中使用TextBox控件的Value节点调用Util中的静态方法Factorial在报表中显示其返回值。
另外一个相关的示例基本上与此相同,只不过在Util类中访问一个文本文件并将该文本文件中的字符显示在报表中

6、导出到Excel

RDLC报表导出到Excel中的效果非常好,曾经看到另外一个报表设计器(好像就是Crystal Report)导出为Excel文件后的效果非常差,单元格根本不对齐,用户无法在其基础上进行二次操作,而RDLC报表导出的Excel文件就没有这个缺点,而且基本上完全保留了原报表设置的格式。如图所示,

可以直接使用Report Viewer控件自带的按钮生成Excel文件,也可以使用如下代码来完成操作:

Microsot.Reporting.WinForms.Warning[] Warnings;
string[] strStreamIds;
string strMimeType;
string strEncoding;
string strFileNameExtension;

byte[] bytes = this.rptViewer.LocalReport.Render("Excel", null, out strMimeType, out strEncoding, out strFileNameExtension, out strStreamIds, out Warnings);

string strFilePath = @"D:report.xls";

using (System.IO.FileStream fs = new FileStream(strFilePath, FileMode.Create))
{
fs.Write(bytes, 0, bytes.Length);
}


对于LocalReport的Render方法,以后的随笔中将进行详细阐述。

7、交互排序

在RDLC报表的众多交互功能中,这个功能是比较新颖的,终端用户可以通过报表中列标题上的图标进行数据的排序,而预览及打印的效果完全取决于用户的排序。[此处好像有一个Bug,即对数据进行一种排序后的预览效果会保持不变,除非再次开启这个应用程序并重新排序。]而这一切不需要在代码中做任何操作,只需要在报表定义文件中添加<UserSort>节并指定相应的SortExpression和SortExpressionScope。

8、RSS新闻阅读器

用ReportViewer实现RSS新闻阅读器?是的!如图所示,
 

当然这个sample是为了展示对Object类型数据源的支持,报表参数ReportParameter的使用也在其中得到体现。

 

9、允许钻取的主子表

另外一种允许向下钻取的主子报表。如图所示,

10、从命令行中打印报表

RDLC报表允许用户不通过ReportViewer图形界面直接使用代码控制输出和打印,还是使用LocalReport的Render方法,以后的随笔中将参照这个示例介绍一个如何自定义纸张的方法。

11、票据生成

这个示例允许用户输入一个单据及其明细后直接生成一个可供打印的票据。如图所示,

12、动态生成一个RDLC文件

这可能是一个最最重要的示例了,RDLC文件是用XML来描述的,可以直接使用代码生成之,这样的报表就可以非常灵活了。像网上比较流行的从DataGridView直接预览、打印数据的程序完全可以用这种方法来替代;进一步引申的话,完全可以实现一个自己的基于RDLC的报表设计器,这样可以让终端用户参与到报表的设计中,至少可以使他们能够修改报表中一些标题、表头等。

GotReportViewer还提供了几个其他的例子,如设置报表参数、通过Email邮寄报表等,由于不是非常典型,不再赘述。

GotReportViwer不知道为什么最近上不去了,有需要这些例程的朋友可以留下Email。