当前位置:首页 >> 电力/水利 >>

利用reportviewer与C#生成报表


关于编写报表,职场中的人相信都会有所感慨,一份整洁、优美的报表会为你在上司面前增 色不少,甚至加薪 :) ——大家都喜欢加薪,对吧?在本文中,将向大家介绍怎样利用 MS Reporting Services 2005 来创建一份报表,并用一个 C#小程序来生成它。 本文假定读者已对 Visual Studio 2005 IDE 有了初步的了解,并能用 C#编写代码,懂 不懂 MS

Reporting Services 都对理解本文没有关系,当然了,之前写过类似的报表,将有 助于你更快地上手。好了,卷起袖子,准备开始吧! 请看图 1,这份报表有多复杂?猜猜它需要多少时间完成?就复杂而言,它只是一份简 单的、从 NorthWind->Products (SQL Server 2000)中提取出来的报表;就时间而言,相信 不会花你一整个小时吧。

图1 下面,我们开始创建报表,首先要编写一个生成报表的 C#小程序。 第一步:创建一个 Windows 应用程序 选择文件菜单,新建-工程,从工程类型中选择 C#,从右方对话框中选择 Windows 应用 程序;在名称栏中,最好用一个表明程序用途的名字;在位置栏中,写明你想要保存的目录。 完成之后,工程中会有一个 Form1,我们就从对它的窗体设计器开始讲解。 像下面这样修改 Form1 的属性,当然也可以依个人喜好修改其他的属性: Form1.Text = "MS Reporting Services 101 with Smart Client" Form1.Size = 750, 300

第二步:为窗体(Form)添加报表查看器(Report Viewer) 什么是报表查看器,就像看 DVD 碟时需要一部 DVD 播放机一样,我们需要一个报表查看 器来预览报表。 对初写报表的人来说,报表查看器可以说是赋予了报表生命,它不仅可预览输出,还可帮助 将报表信息生成各种格式(PDF 或 Excel 等等) ,打印出来更不在话下。 [span] 请按如下步骤在 Form1 上放置好报表查看器控件: 依次找到工具箱(ToolBox)-数据(Data)-报表查看器(ReportViewer) ,并把它拖 到 Form1 上。这会创建一个名为 reportViewer1 新的实例。 通过设置 reportViewer1.Dock = Fill,报表查看器将会填充窗体的整个区域,以显示报表。 在完成第一步与第二步之后,工程看起来应该如图 2 所示:

图2 第三步:为工程添加数据集(DataSet) 数据集是伴随报表查看器而来的,它保存并提供从数据源而来的原始数据,我们便可对 这些原始数据进行处理或在 C#程序中输出。 请依照如下步骤添加数据集: 从解决方案资源浏览器中选择添加-新项目-数据集,将其名称 DataSet1 修改 dsProduct,并单击添加按钮完成。 添加一个数据表到新创建的数据集中。数据表实质上是用来加载报表数据的,在设计报 表时,将会用到 DataSet/DataTable 中的相关信息。 以下为添加数据表到数据集(dsProduct)中: 从解决方案资源浏览器中双击 dsProduct,将会打开设计视图,右键单击并选择添加- 数据表。接着,单击表头修改名称为 dtProductList,如图 3:

图3 接下来开始为数据表(dtProductList)添加列,此时的设计视图应该如图 4 所示。右键 单击 dtProductList 并选择添加——列(Column) 。

图4 重复以上步骤添加以下列: ProductName (String) QuantityPerUnit (String) UnitPrice (Double) UnitsInStock (Double) UnitValue (Double):一个基于 UnitsInStock * UnitPrice 的计算域 在添加列时,默认为 String 数据类型,添加完之后请转到属性窗口,修改相应的列为 Double 类型。

请看图 5,现在的数据表看上去应该就像这样子了。同时,你也可查看属性窗口来修改数据 类型。

图5 第四步:为工程添加报表 到目前为止,我们已经创建了工程,添加了报表查看器与数据集;现在,是时候创建一 份整洁、优美的报表了。 需按照以下步骤生成报表(rptProductList.rdlc) : 从解决方案资源浏览器中选择添加-新项目-报表,把名称 Report1.rdlc 修改为 rptProductList.rdlc,并单击添加按钮完成。 工程可能会像图 6 这样;而添加完报表之后,就可以开始使用数据集(DataSet)进行设 计了。

图6 无论你是第一次设计报表的新手,或是历经沙场老手,都必须与以下三种最基本的报表 区域打交道:页眉(或叫表头) 、页脚、表体。一般来说,报表在设计时,就应该有一个腹稿, 如多大的纸张、应该怎样排版等等,通常都为信纸大小、纵向排版。当然了,如果能在动手 之前,先在纸上画个草图,这样更好。可以回过头来看一下图 1,在页眉,已经有了报表名 及报表日期,表体中有产品的相关信息列表,而页脚中有页码。 那我们就从页眉开始吧。当添加新报表到工程时,默认情况下,在报表设计器中只能看 到表体。右键单击报表设计器的表体之外处,选择页眉,这会在报表中添加一个页眉,可以 随意调整页眉与表体区的高度,请看图 7,图 7 中减少了表体的高度,增加了页眉的高度。

图7 在报表设计器的工具箱中,你可以看到用于设计报表的各种各样的控件。在我们这个例 子中,会用到 TextBox、Line 和 Table 控件。现在我们开始设计页眉了。拖动两个 TextBox 并把它们置于页眉区,TextBox 既能显示静态也能显示动态的数据,而 Line 控件用于把页眉 从表体区中分隔出来。控件放置好之后,可以修改它们的属性以显示我们所需的值,例如可 以指定一个 TextBox 为报表标题,而另一个 TextBox 显示当前日期。选择 TextBox 之后,可

直接在其内输入静态文本。 请照以下修改标题 TextBox: Value = "Product List" Color = Purple 而日期 TextBox 则修改为: Value = "Run Data: " & Today Color = Purple [span] 要注意了,日期 TextBox 的 Value 属性以"="符号打头,这代表它不是一个简单 的静态文本, 而是一个表达式, 这个表达式是字符串"Run Date"与 VB.NET 脚本 Today 的结果。 另外多说一点,你可对报表中所有对象指定任何你想要的名称,一般对大多数控件而言,保 持默认名称就好了,此处把标题 TextBox 的名称(即 Name 属性)指定为“txtTitle” 。 参照图 8,完成页眉设计之后,应该看起来就像这样子:

图8 现在是表体了。表体是承载信息的详细区域,是整个报表最重要的部分,而且你也看到 了,当添加报表到工程时,表体已经自动添加了,我们只需要在上面放些控件就行了。 从传统意义上来说,表体区是用于显示详细数据的(在本例中,为产品信息) ,并且通常 为多行信息,而随着报表上数据的增多,表体区也相应会扩展,但一般来说,报表只会设计 为一页(信纸或 A4 纸大小) 。 在表体区中,有三种最常用的控件:Table、Matrix、List,在本例中会使用 Table 控件。在 报表设计界面中,拖动并把 Table 控件放置于表体区中,你会看到,这会生成一张三行三列 的表,而中间一列则已被标记为:Header、Detail、Footer。 当你知道 Table 控件只不过是一堆 TextBox 的组合,是不是有点吃惊呢。对了,Talbe 中的每个单元(Cell)都与 TextBox 一样,也就是说,可以在其中输入静态文本,或指定一 个动态表达式。 在开始设计表体区之前,记得要多添加两列(我们的报表中有 5 列喔) ,添加列非常简单,依 照以下步骤就行了: 1、 在表体区中选择 Table 控件。 2、 左键单击最右边一列的表头(此处假设你是从右边添加新列的) 。 3、 右键单击表头,并选择“Insert Column to the Right” (在右边插入列) 。

现在报表看起来应该像图 9 了,可以依据列中的数据随意调整列的宽度。

图9 大家多半也用过 Excel 或类似的东西吧,可以把 Table 控件看成是一张迷你工作表,在 其中可以选择边框类型、改变任一单元格的字体等等。因此,所需做的就是依之前设想好的 格式来设计表格。 我们从第一列开始,随后的每一列也一样,单击最上方的单元格并依次输入: 表头 1: “Product Name” 表头 2: “Packaging” 表头 3: “Unit Price” 表头 4: “Units in Stock” 表头 5: “Stock Value” 而 在 接 下 来 的 详 细 数 据 区 ( 即 前 面 的 Detail ) 中 , 需 要 输 入 表 达 式 , 其 为 dsProduct.dtProductInfo 中的列,在此既可以手工输入表达式,也可以从数据源(Data Sources)工具箱(见图 7 左边)中拖放实现。 如果想要手工输入,请从数据区的第一列至最后一列,单击单元格并输入: Detail Detail Detail Detail Detail 1: 2: 3: 4: 5: "=Fields!ProductName.Value" "=Fields!QuantityPerUnit.Value" "=Fields!UnitsInStock.Value" "=Fields!UnitPrice.Value" "=Fields!UnitsInStock.Value * Fields!UnitPrice.Value"

请留意 Detail 5,它是一个对 Units in Stock 与 Unit Value 相乘计算之后的输出。另 外提醒一点,如果是拖动列到 Table 控件中的数据区来实现的,此时如果表头为空,它会自 动添加表头。 最后,在 Table 控件的页脚添加一累计栏,选择表体区第 4 与第 5 列的页脚单元格,输入: 单元格 4: “Total Value:” 单元格 5:"=SUM(Fields!UnitsInStock.Value * Fields!UnitPrice.Value)" 单击单元格 5,这是使用了一个内置的 SUM()函数来得到累计的结果。

最后只剩下页脚区了,在开始编写一些 C#代码之前,还需完成报表的页脚,正如前面添 加报表页眉一样,在打开的报表设计器中,右键单击并选择页脚(Page Footer) ,见图 7。 拖动一个 Line 和 TextBox 控件置于页脚区,并在 TextBox 中输入以下表达式:

Value: ="Page: " & Globals!PageNumber & "/" & Globals!TotalPages 大家可以看到,此处使用了 PageNumber 和 TotalPages,两 者皆为全局变量。 现在,报表应该像图 10 这样了,此处,还改变了一点颜色,把数值类数据右对齐,把 Table 当作一张 Excel 工作表好了,可以随意调整为你想要的外观。

图 10 快大功告成了!剩下的就是表达式生成器了。表达式生成器是 Reporting Services 中一 个非常强大的工具,正如图 11 中所见,Stock Value 是通过 SUM 函数计算得到的,DateSet 中的所有数据都可以由“Fields!”关键字访问。

图 11 第五步:编写赋予报表生机的 C#代码 从解决方案资源浏览器中,选择 Form1,右键单击并选择查看代码,为 Form1_Load 添加 以下代码: using System.Data.SqlClient; using Microsoft.Reporting.WinForms; private void Form1_Load(object sender, EventArgs e) { //声明连接字符串 string cnString = @"(local); Initial Id=northwind;Password=northwind";

Catalog=northwind;"+"User

//如果使用标准安全属性,请改为以下代码 //string cnString = @"Data Source=(local);Initial Catalog=northwind; Integrated Security=SSPI"; //声明连接、命令对象及其他相关对象 SqlConnection conReport = new SqlConnection(cnString); SqlCommand cmdReport = new SqlCommand(); SqlDataReader drReport; DataSet dsReport = new dsProduct();

try { //打开连接 conReport.Open(); //准备连接对象以把获取的数据放入数据集 cmdReport.CommandType = CommandType.Text; cmdReport.Connection = conReport; cmdReport.CommandText = "Select TOP 5 * FROM Products Order By ProductName"; //从命令对象中读取数据 drReport = cmdReport.ExecuteReader(); //有了 ADO.NET,可把读取来的数据直接加载到数据集中 dsReport.Tables[0].Load(drReport); //关闭读取及连接 drReport.Close(); conReport.Close(); //为查看器提供本地报表数据 rpvAbraKaDabra.LocalReport.ReportEmbeddedResource = "rsWin101.rptProductList.rdlc"; //准备报表数据源 ReportDataSource rds = new ReportDataSource(); rds.Name = "dsProduct_dtProductList"; rds.Value = dsReport.Tables[0]; rpvAbraKaDabra.LocalReport.DataSources.Add(rds); //加载报表查看器 rpvAbraKaDabra.RefreshReport(); } catch (Exception ex) { //显示错误信息 MessageBox.Show(ex.Message); } finally { //检查连接是否仍然打开,如果是,关闭它。

if (conReport.State == ConnectionState.Open) { conReport.Close(); } } } 看到这,大家可能会想,为什么在 select 查询语句中使用了“TOP 5” ,此处只是作演示 的目的,对输出作一限制,以得到如图 1 中的累计结果。另外,ReportDataSource 的 Name 属性应总为“DataSet_DataTable” 。

本 文 来 自 CSDN 博 客 , 转 载 请 标 明 http://blog.csdn.net/mountplorer/archive/2009/05/07/4157216.aspx








相关文章:
利用reportviewer与C#生成报表
利用reportviewer与C#生成报表_IT/计算机_专业资料。关于编写报表,职场中的人相信都会有所感慨,一份整洁、优美的报表会为你在上司面前增 色不少,甚至加薪 :) —...
C#报表使用方法(report viewer)
的窗体中,并选择报表 report22.rdlc 8 在窗体代码中,对报表中参数,和数据集...C#报表控件ReportViewer... 20页 2下载券 利用Reportviewer生成RD... 10页 ...
C#报表控件ReportViewer的使用
C#报表控件ReportViewer使用_IT/计算机_专业资料。个人随笔 【转】C#报表控件 ReportViewer使用(转) 2011-11-01 20:05 转载自 金玉 kl_y 最终编辑 金玉 ...
真正地全动态报表RDLC和ReportViewer
ngen.exe 动态报表生成速度比较慢, 有个解决办法, 在命令行方式下敲入 ngen...VS2010报表ReportViewer... 7页 免费 利用reportviewer与C#生... 8页 免费 ...
简单ReportViewer报表创建方法
简单ReportViewer报表创建方法_计算机软件及应用_IT/计算机_专业资料。选填,简要介绍...利用reportviewer与C#生... 8页 5下载券 reportviewer与C#生成报... 暂无评...
VS2010报表ReportViewer数据的生成
VS2010 报表 ReportViewer 数据的生成-添加程序运行过程中生成表字段与参数 开发...C#报表控件ReportViewer 25页 1下载券 利用AutoLisp、Microsof... 4页 1下载...
[C#]ReportView显示本地报表==
[C#]ReportView 显示本地报表使用 ReportView 控件...Report service 的报表,也可以处理生成本地报表,用法...reportViewer1.RefreshReport(); } private DataTable...
VS2008中的报表控件ReportViewer的应用
VS2008中的报表控件ReportViewer的应用_计算机软件及应用_IT/计算机_专业资料。VS2008 中的报表控件 ReportViewer 的应用使用手册有 3 步: 一.添加一个数据集,就...
[C#]ReportView显示本地报表
[C#]ReportView 显示本地报表使用 ReportView 控件可以显示远端 Report service 的报表,也可以处理生成本地报表,用法 也比较简单,下面列举一下简单的步骤。 首先...
更多相关标签:
reportviewer 子报表 | reportviewer动态报表 | reportviewer报表 | reportviewer 生成pdf | reportviewer | reportviewer控件 | reportviewer控件下载 | c reportviewer |