RDLC报表(一)


        VS .NET开发中,用什么做报表?

        可能的回答是Crystal Report,自.NET“紧密”集成Crystal Report后,这可能是开发人员比较单一的选择。但是,这种集成似乎并不非常紧密,网络上充斥着关于使用Crystal Report的抱怨,太复杂也许是其最为令人诟病的地方,自定义性比较差也不能为程序员们所容忍。

        当然,必须承认Crystal Report的功能还是非常强大的,被Business Object收购以后,商业职能的成分也在逐渐增加,也形成了一定规模的用户群。

        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 Language的缩写,那么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 Control的内容非常少,我只能按照自己的理解来说一些东西,这其中肯定会有一些偏差,欢迎各位的批评指正。另外,我所涉及的内容都是关于LocalReport的,对于ServerReport没有进行研究。


            相关的资源:

            MSDN的Visual Studio Controls论坛  http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=75&SiteID=1 
            GotReportViewer   http://www.gotreportviewer.com/ (有几个非常经典的例子,不知为什么最近我无法上这个网站了,呵呵,谁知道请告诉我原因,谢谢!) 

           

Life is like a boat, and I'm at sea.

posted @ 2006-02-25 19:58 蜡人张 阅读(61422) 评论(48) 编辑 收藏

 回复 引用 查看   
#1楼 2006-02-25 21:12 笑望人生      
严重支持!!

正好我在准备一个项目,其主要目的实际上不是复杂报表,而是生成表格输出到打印机。当然,是WinForm项目。

我在VS2003中根本就没有用过水晶报表,而是使用的是ActiveReport.Net,网上流传的ActiveReport的注册机就是我写的。

不过ActiveReport有个缺点,就是定义打印的表格线时,生成规格数据表的时候,如工资报表一类的打印时,表格线定义不好,不是打成双线,就是线条露头。


所以请您在写文章的时候,主要写一下表格设计。在很多项目中的报表都是两个数据源,一个是报表单独的一些信息,比如说单位、名称,电话,地址,负责人等单个信息,另外就是一个可以保存在数据库中的列表信息。我希望了解的就是怎样画出表格,并成功绑定这两种信息,这种报表好像是镶套报表。


报表是所有项目中不可缺少的部分,尤其是在中国这样的变态格式报表。所以对您的工作,我非常感谢您,期待您的精彩文章!

 回复 引用   
#2楼 2006-02-25 22:46 Yngwie[未注册用户]
非常感谢,我也正在开发报表唱主角的一个项目,学习了!
 回复 引用 查看   
#3楼 2006-02-26 14:31 萝卜      
我最近用这个报表做了单据打印,效果非常好!不过要通过一些变通的方法才行!
 回复 引用   
#4楼 2006-02-26 16:45 Yng[未注册用户]
很不错!
 回复 引用 查看   
#5楼 2006-02-27 11:21 A.Z      
支持纯托管平台的可视化报表软件。
 回复 引用   
#6楼 2006-03-04 12:30 joing[未注册用户]
非常感谢
 回复 引用   
#7楼 2006-03-09 19:46 光速[未注册用户]
之前,我用过水晶报表,已经开始用得顺手了,不过与VS的结合还不是很紧密,从VS2003到VS2005,水晶报表的部署都是件麻烦事。其次,数据源也件麻烦事,有个报表中用了子报表,到目前我也不知道怎么给子报表指定数据源。
刚刚用了几天,不难发现RDLC轻松支持多个DS,多个数据表(毕竟是自家的东西),还有导出到EXCEL也很好,基本是原样导出,导出功能比水表好多了(自家嘛..)
不过现在我对RDLC的许多功能都还不了解...特别是统计和公式。

 回复 引用 查看   
#8楼 2006-03-11 08:29 anchky      
楼主很有见地。
我虽然没有用过RDLC,但是已然能了解其某些方面的强大功能。
我们也一直在致力数据仓库分析前端展示的研究,我们的Grid展示一直建议、也一直坚持在用FlexGrid。FlexGrid控件相信大家都比较熟悉,用它来支持dw的多维展示,需要自己写比较的代码来支持,不过也正是由于这样,FlexGrid展示相对比较灵活。反映速度也可以。
看了楼主的这篇文章,我很想详细了解下所谓RDLC。

 回复 引用 查看   
#9楼 2006-03-11 08:33 anchky      
很想知道,楼主用图形展示报表吗?
 回复 引用 查看   
#10楼[楼主] 2006-03-11 11:06 蜡人张      
@anchky
肯定是要用图形来展示报表的,对RDLC报表来说,这也不是问题,因为MS提供了功能强大的Chart控件,但MS在图形化报表方面一直没有一个Dash Board(好像BIP里面有,记不清了),但我相信,MS很快就会出一个完整的BI前端展示工具。当然,图形报表实现的方法很多,也可以考虑自己写,相关的技术大概有OWC,SVG,VML,GDI+,SGC等等。

 回复 引用   
#13楼 2006-05-16 14:55 长江支流[未注册用户]
有幸在网上以“打印通”搜到作者RDLC报表(三),作者过奖。
确实,《金质打印通》可以用RDLC实现。但是,它的姊妹篇《天下报表》(www.AnyReport.Net)也在可以解析VS2005报表设计器的同时,还可以解析一些Html、VS Web设计器生成的元素。

 回复 引用   
#14楼 2006-10-18 14:56 yfklx[未注册用户]
谢谢,学到了很多
 回复 引用 查看   
#15楼 2006-10-23 09:02 Tseng      
太好了,不知道RDLC的部署不知道麻烦码?
前短时间用了VS2005的水晶报表,报表是做好了,但是部署一直都搞不成功,特麻烦。

 回复 引用   
#16楼 2006-11-22 12:54 老木子[未注册用户]
在使用动态生成报表过程中,如果有中文字符,则导出到pdf时会出错,导出到excel不出错,请问是什么原因?
 回复 引用   
#17楼 2006-12-25 10:24 ghx88[匿名][未注册用户]
请问生成rdlc报表可不可以不访问数据库,直接建个DataTable 来绑定?

DataTable dt = new DataTable();
dt.Columns.Add("project", typeof(string));
dt.Columns.Add("score", typeof(int));
DataRow dr1 = dt.NewRow();
dr1["project"] = "语文";
dr1["score"] = 96;
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["project"] = "数学";
dr2["score"] = 80;
dt.Rows.Add(dr2);
……
ReportViewer rv = new ReportViewer();
rv.LocalReport.ReportPath = "re.rdlc";
ReportDataSource rds = new ReportDataSource("CustomDt", dt);

试过这样不行,有没有什么好方法?如何设置Rdlc?

 回复 引用   
#18楼 2006-12-27 23:07 jj[匿名][未注册用户]
可以条件筛选dataset么?请问各位这样用过么?
 回复 引用 查看   
#19楼 2007-01-10 10:20 chinachen      
关注。
 回复 引用   
#20楼 2007-02-28 17:51 Juny[未注册用户]
报表分组后,怎么样汇总单个组内的数据呢?
期望赐教,找了半天没找到,
Email Dr.JY@163.com

 回复 引用   
#21楼 2007-03-22 10:22 ooo[未注册用户]
不错
 回复 引用   
#22楼 2007-07-25 15:50 lan[未注册用户]
如何在这个控件里面制表格,并且在winfrom运行预览时显示出表格?
 回复 引用   
#23楼 2007-08-13 11:27 紫沫[未注册用户]
rdl导出EXCEL时子报表被忽略,什么原因呀?
 回复 引用 查看   
#24楼 2008-01-04 09:38 林志松      
好像挺简单的.

不过不知道怎么搞












http://www.map99.net

 回复 引用 查看   
#25楼 2008-05-28 15:41 编程的夜猫      
支持,收藏了,以后用得着.
 回复 引用 查看   
#26楼 2008-06-03 10:18 逍遥海盗船      
是哦,怎么汇总组内的数据?水晶报表比较简单,RDLC不知道怎么用。
 回复 引用 查看   
#27楼[楼主] 2008-06-05 11:27 蜡人张      
@逍遥海盗船
很简单,直接使用表达式生成器,选择sum就可以了。

 回复 引用 查看   
#28楼 2008-06-05 11:58 逍遥海盗船      
@蜡人张
呵呵,我会了,我原来是有两个表,直接拉过来在后面多了个表名所以出错了。将后面的参数删除就可以了。呵呵!

 回复 引用 查看   
#29楼 2008-06-05 11:58 逍遥海盗船      
@蜡人张
谢谢!

 回复 引用 查看   
#30楼 2008-07-21 11:18 hbf      
瞧瞧
 回复 引用 查看   
#31楼 2008-07-31 14:25 时间太快      
正在学习中。非常感谢。。这方面的资料也很少。。
 回复 引用 查看   
#32楼 2009-05-22 13:19 RuqingWang      
研究了一段水晶报表,功能比较强大,但是没有搞清楚,原来有数据,但是刷新后数据就没了,学习学习RDLC报表,系统能学会
 回复 引用 查看   
#33楼 2009-08-19 10:56 chunshen      
以前就知道有这样一个优秀的Blog。
现在想使用RDLC开发一个报表网站,重新看到这个网站。
深入学习下。
另外,不知道这3年下来,微软结合RDLC的图形界面设计,以及与SSAS(BI)的结合,除了在SharePoint里面事先以外,单独使用Web Reports有没有一个比较好的解决方案,可以实现灵活的多维展现和图形匹配。

 回复 引用 查看   
#34楼 2009-09-17 17:21 BlueFly      
不错!收藏了,最近开始使用 MS Report 了,被水晶报表搞怕了。
 回复 引用 查看   
#35楼 2010-07-09 15:58 还是小混混      
张老师,在WPF窗体应用程序里RDLC的路径应该怎样配置才能实现发布(ClickOne)后客户端能看到报表呢?
无限感激~

 回复 引用 查看   
#36楼 2010-07-13 10:17 .。oоΟ○〇      
张老师,你好,今天看到你介绍的rdlc资料,受益匪浅,前几天被这个搞的头大死了,现在还有一些问题,就是如何修改reportview的样式啊,现在显示时总在页面左边,右边留了很多空白,看起来不太舒服。另外表格字段有checkbox的话该如何实现呢?希望您能多给我提供一些资料,给点指点意见,非常感激...
 回复 引用 查看   
#37楼 2010-07-21 20:49 C#新手[新手]      
你好,张老师,我是一个初涉c#的新手,看了你写的文章就知道你在这方面非常强悍,我现在遇到一个关于报表的问题,想请教一下张老师!
是这样的,我这里系统架构是c#下wcf+linq分布式应用!
环境是vs2010,在使用rdlc实现报表的时候,对rdlc的即时数据邦定,出了问题,怎么也不能打开report,程序却不报错!
this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.LocalReport.ReportEmbeddedResource ="print_per_addBooks.rdlc"; this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("EmployeeInfo", PcurrentEmployeeInfo.ToList()));
this.reportViewer1.RefreshReport();

PcurrentEmployeeInfo 这里取出数据集
但是就不能载入report,请你在不忙的时候回复zjxfly@126.com
谢谢!

 回复 引用 查看   
#38楼 2010-07-23 10:49 报表工具研究      
中国式报表用国内报表工具开发更合适,报表工具推荐锐浪报表Grid++Report(www.rubylong.cn)
 回复 引用 查看   
#39楼 2010-07-29 07:42 C#新手[新手]      
张老师不在??

 回复 引用 查看   
#40楼 2010-11-04 16:16 惠州浪子      
蜡人张,我现在用RDLC遇到一些复杂报表的设计与部署问题,想直接与你沟通请教一下,我Q:36772931,希望能得到你的帮助,谢谢!
 回复 引用 查看   
#41楼 2011-06-02 18:03 shenkxiao      
谢谢分享 但是想更深入了解一些关于RDLC的属性、环境、支持各种平台和语言方面的
 回复 引用 查看   
#42楼 2011-07-05 23:27 fc5110      
有没有做过多曲线的
http://www.cnblogs.com/fc5110/gallery/image/104700.html

我的qq 276269035

 回复 引用 查看   
#43楼 2011-07-26 15:13 Edwin dong      
张老师,你好,我想问一下,在导出RDLC报表的时候能不能给导出的Excel添加一个计算公式,公式是用来计算Excel内的两个单元格相减的。
我的QQ:282288130.非常感谢

 回复 引用 查看   
#44楼 2011-08-04 16:01 静水一一      
张老师您好,我想做一个rdlc折线图,横轴时间,纵轴温度,希望加两条红色和黄色的横线做警戒线,现在是加了个Type字段做成了三条折线的形式,为红黄线插了两个点,只是左端怎么也靠不到Y轴上,请问时间坐标到达改怎样设置呢?
还有,我把时间轴的轴属性标为标量轴的时候三条线才能正常显示,可是标量轴只显示年月日,我想显示时分秒,但是这样的话温度线显示完,红黄线才在右侧显示出来,而不是上下排列的。请问应该怎么做呢?

 回复 引用 查看   
#45楼 2011-08-05 14:07 haochuan      
张老师您好,我正在rdlc报表.我用rdlc报表导出的excel文件里都是一些乱码,还有导出的pdf文件汉字不显示,导出的world文件竟然需要什么转换器,这些问题都该怎么解决呀?如果我想自己编程导出这些文件,该如何做呀?
 回复 引用 查看   
#46楼 2011-08-11 21:17 气泡      
张老师好,不好意思打扰了!
目前项目中遇到一个比较棘手的问题,想在这提出来。大家讨论下。问题是这样的:
在帐票的页眉处有一个 部门 需要显示部门名称,当有多个部门时需要换页,同时在每一个部门的最后需要一个金额的集计。

当部门A的数据正好在一页内显示时,然后集计的那条数据据会转到下一页去。这样 若把部门名称放在每条数据的明细中时 在换到第二页的时候是没有明细数据的。这就会导致页眉的 部门名称 取不到。

大概问题是这样的。不知张老师明白没有,呵呵!

 回复 引用 查看   
#47楼 2011-08-23 15:27 cjxvswf      
张老师.有几个问题想咨询一下:
1.RDLC报表如何在B/S下实现套打;
2.B/S下,如何自定义ReportViewer的工具栏;
希望您能不惜赐教:这是我邮箱cjxvswf@sina.com