RDLC报表详细讲解与分析报告
- 格式:doc
- 大小:1.56 MB
- 文档页数:66
RDLC报表随笔……(,感谢网友”蜡人”)(一)VS .NET开发中,用什么做报表?可能的回答是Crystal Report,自.NET“紧密”集成Crystal Report后,这可能是开发人员比较单一的选择。
但是,这种集成似乎并不非常紧密,网络上充斥着关于使用Crystal Report的抱怨,太复杂也许是其最为令人诟病的地方,自定义性比较差也不能为程序员们所容忍。
当然,必须承认Crystal Report的功能还是非常强大的,被Business Ob ject收购以后,商业职能的成分也在逐渐增加,也形成了一定规模的用户群。
Visual Studio .NET进入2005版本以后,Crystal Report与IDE的结合更“紧密”了,至少我们看不到那个讨厌的注册窗口了。
但是,Microsoft似乎并不容忍在自己的超级工具中竟然没有报表工具,于是Report Viewer Control出现了,我把它的报表称为RDLC报表。
在VS .NET 2005之前,SQL Server Reporting Services中已经提供了一种被称为报表定义语言(Report Definition Language, RDL)的语言;在VS .NET 2005中,Microsoft提供了针对这种报表的设计器,并提供了在WinForm和WebForm中使用这种报表的能力。
Microsoft将这种报表的后缀定为RDLC,RDL仍然是Report Definition Lan guage的缩写,那么C代表什么呢?C代表Client-side processing,凸显了它的客户端处理能力。
这种报表的易用性和可定制性让我们完全有理由放弃Crystal Report,让我们来看看它的强大功能吧:1、简单易用的控件,特别是Table控件,非常方便字段在报表上的排列;2、灵活的可定制性,用XML来描述一个报表相关的一切,不用说了吧?3、高度可编程性,在你的项目中,甚至不需要有一个报表文件,通过代码就可以实现报表生成、预览和打印等一系列操作;4、支持DrillThrough数据钻取功能;5、导出的Excel文件格式非常完美,任何其它报表在这方面都不能与之比拟,而且并不需要安装Excel;……[偷偷懒,其实我并不擅长总结某某的特点,我只能从实际经验中得到一点点结论,而且我也不原意去抄袭帮助中的New Features,呵呵……]在以后的几篇随笔中,我将结合最近一段时间使用RDLC报表的经验继续探讨相关的一些问题,大致容包括:报表设计器的使用、LocalReport的一些相关操作,如何自定义纸等等,欢迎大家提出参考意见。
(二)需要说明的是,现在关于VS. NET 2005中的Report Viewer Con trol的容非常少,我只能按照自己的理解来说一些东西,这其中肯定会有一些偏差,欢迎各位的批评指正。
另外,我所涉及的容都是关于LocalReport的,对于ServerReport没有进行研究。
在这篇随笔中,我主要分析一下GotReportViewer上的几个经典例子,我们可以从中看到R eportViewer Control的强大功能:1、Web Log Analyzer这是一个比较典型的OLAP应用,我们可以看到RDLC报表强大的Ch art和Navigation功能。
当然了,例子中解析W3C标准日志文件的代码也非常有借鉴意义。
这个Starter Kit在我的随笔blogs./archive/2006/01/19/320280.htm l中曾经提到过,不再详述。
2、子报表展示如何使用子报表显示主记录的详细信息,这种应用很像Access中的子报表功能。
主要使用SubreportProcessing事件为子报表提供数据。
3、钻取报表钻取报表是通过设置Navigation(HyperLink)和Parameters来实现的,通常在OLAP应用程序中很有用。
4、具有子报表的钻取报表这个例子实现的功能类似Excel中数据透视表(Pivot Table)的功能,在一个复杂的交叉表中可以进行时间和商品两个维度的向下钻取。
这在别的报表中恐怕是很难实现的。
如图所示,5、引用外部代码块此示例演示从另外一个类Util中读取函数返回值到报表中:首先,使用LocalReport的AddTrustedCodeModuleInCurrentAppDomain方法允许Util类中的方法在R eport Viewer中执行,然后在报表中使用TextBox控件的Value节点调用Util中的静态方法Factorial在报表中显示其返回值。
另外一个相关的示例基本上与此相同,只不过在Util类中访问一个文本文件并将该文本文件中的字符显示在报表中6、导出到ExcelRDLC报表导出到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 str MimeType, out strEncoding, out strFileNameExtension, out strStreamIds, o ut Warnings);string strFilePath = "D:\report.xls";using (System.IO.FileStream fs = new FileStream(strFilePath, FileMode.C reate)){fs.Write(bytes, 0, bytes.Length);}对于LocalReport的Render方法,以后的随笔中将进行详细阐述。
7、交互排序在RDLC报表的众多交互功能中,这个功能是比较新颖的,终端用户可以通过报表中列标题上的图标进行数据的排序,而预览及打印的效果完全取决于用户的排序。
[此处好像有一个Bug,即对数据进行一种排序后的预览效果会保持不变,除非再次开启这个应用程序并重新排序。
]而这一切不需要在代码中做任何操作,只需要在报表定义文件中添加< UserSort>节并指定相应的SortExpression和SortExpressionScope。
8、RSS新闻阅读器用ReportViewer实现RSS新闻阅读器?是的!如图所示,当然这个sample是为了展示对Object类型数据源的支持,报表参数Repo rtParameter的使用也在其中得到体现。
9、允许钻取的主子表另外一种允许向下钻取的主子报表。
如图所示,10、从命令行中打印报表RDLC报表允许用户不通过ReportViewer图形界面直接使用代码控制输出和打印,还是使用LocalReport的Render方法,以后的随笔中将参照这个示例介绍一个如何自定义纸的方法。
11、票据生成这个示例允许用户输入一个单据及其明细后直接生成一个可供打印的票据。
如图所示,12、动态生成一个RDLC文件这可能是一个最最重要的示例了,RDLC文件是用XML来描述的,可以直接使用代码生成之,这样的报表就可以非常灵活了。
像网上比较流行的从DataGridView直接预览、打印数据的程序完全可以用这种方法来替代;进一步引申的话,完全可以实现一个自己的基于RDLC的报表设计器,这样可以让终端用户参与到报表的设计中,至少可以使他们能够修改报表中一些标题、表头等。
GotReportViewer还提供了几个其他的例子,如设置报表参数、通过Emai l邮寄报表等,由于不是非常典型,不再赘述。
GotReportViwer不知道为什么最近上不去了,有需要这些例程的朋友可以留下Email。
(三)仔细想了一下,我觉得一篇step by step的随笔似乎是不必要的,由于RDLC报表设计时的简易性,任何有报表经验的人都可以在摸索后很容易就掌握其报表的设计方法。
本来在这篇随笔中想谈一下对RDLC报表文件的解析,但是MISGoldPrinter的作者flygoldfish(长流支流)已经对这方面进行了详细的总结(见/flygoldfish/archive/ 2005/12/16/554035.aspx),长江支流对报表非常有研究,建议大家到他的Blog上看看,不过我觉得他实现的金质打印通完全可以用RDLC报表中的容所替代,这只是个人意见,希望以后能见到他的更多作品。
另外,我手头有一份RDL规(Report Definition Language Specificati on),非常值得阅读,推荐给大家.cnblogs./Files/waxdoll/RDLCS.rar。
两幅截图:MatrixTable本来打算不要这篇随笔了,因为没有什么具体的容,但为了保证完整性,还是放在这吧,不过我不放在首页了,免得污染大家的视线,呵呵……下一篇随笔可能是关于Table和Matrix这个两个控件的,不过我还没具体想好。
(四)....RDLC 报表中有一个概念叫数据区域(Data Region),数据区域是数据绑定的报表项目,在 数据区域中可以显示来自数据集的多行数据。
RDLC 报表设计器中的数据区域包含控件面板 上的一系列控件:List、Table、Matrix、Chart,如图所示,List 控件的用处在于这是一个在其中可以自由安排像 TextBox、Image 等 控件;Chart 控件用于显示图表,和 Excel 中的图表比较相似。
这篇随笔不会涉及到这两个 控件,主要讲一下 Table 和 Matrix 两个控件。
先来看 Table 控件。
Table 控件有多个部分组成,如标题行(header)、表 尾(footer)、数据行(detailed rows)、分组表头(group header)、分组表尾(group foote r)等,如图所示,.下载可编辑.....之所以设计这样一个控件,我想 Microsoft 一定是在简化报表的设计:在这个控件未出现之前,我们看一下一个具有 heaer、detailed rows 和带 统计信息的 footer 的报表时如何实现的。