1、第9章 数据报表与数据图表数据报表和数据图表是信息系统不可或缺的部分。数据报表和数据图表是将信息汇总输出或打印的一种表现形式,不仅可以集中、分类显示数据,还可以帮助用户进一步分析信息。Visual Studio 2005集成了标准报表创建工具水晶报表(Crystal Reports),在ASP.NET环境下可以快速地实现数据报表和数据图表。9.1数据报表和数据图表概述 1认识数据报表和数据图表右图是Crystal Reports自带的示例数据报表World Sales Report.rpt的运行效果。报表右侧为产品在各国家销售总额的数据表,左侧是以饼图展示的各国家销售比例的数据图表,另外,图中
2、还包括了有图表的页眉、页脚等。2数据报表设计在Web应用程序中实现报表之前,首先应当进行报表设计,即根据业务需要和用户需求确定报表基本内容,列出信息大纲和布局,主要包括:(1)确定报表的总体目的和用途)确定报表的总体目的和用途。(2)确定报表布局)确定报表布局:为报表拟订标题、页眉页脚中所需要的识别信息(如打印日期、报表页码、制表人信息、描述报表目的的文字、数据包含的范围)等。(3)确定数据来源)确定数据来源:确定报表中所用的数据,包括数据库的类型和来源、获取数据库表中的数据、对数据字段值进行运算等。(4)明确数据处理方法)明确数据处理方法:包括数据的分组、排序、筛选、汇总、标记等。(5)确定
3、打印区域特性:)确定打印区域特性:包括确定打印顺序、打印频率等。(6)设计报表的纸张原型:)设计报表的纸张原型:即在纸上规划出报表内容和布局。3数据图表设计在数据报表中,除了数据列表和汇总,还可以包含彩色的、易读的图表,以增加报表的可读性和分析能力。可根据数据特点选择合适的图表类型,报表中常用的图表有条形图、饼图、散点图、面积图、雷达图等等。图表不仅是一种表示数据的方法,也是一种分析工具,能够深化对数据的理解。当向报表中添加图表时,通常根据组级的汇总和小计信息绘制图表。根据所用数据特点,也可以为报表创建高级图表、交叉表图或OLAP网格图表。9.2.NET水晶报表(Crystal Reports
4、)1.水晶报表核心组件 嵌入式嵌入式 Crystal Reports Designer:创建或修改报表。由一个图形用户界面(用于“所见即所得”的报表设计)和一系列“报表专家”(用于简化数据连接、排序、分组和其它报表设计问题)组成。报表查看器控件报表查看器控件CrystalReportViewer:将报表添加到应用程序中窗体上,用于显示报表。对象模型对象模型:.NET水晶报表提供了包含两个基本对象模型(CrystalReportViewer和ReportDocument)的SDK。使用对象模型可以采用代码方式开发专业的数据报表。9.2.1.NET水晶报表简介2.NET水晶报表的数据访问方式n推模
5、式(PUSH)首先创建与报表中的字段相匹配的数据集DataSet,然后将该数据集“推”送至报表。该方法可以在应用程序中共享数据库连接和数据集,并且在推送之前筛选出所需数据,从而提高报表性能。拉模式数据访问 推模式数据访问 拉模式(PULL)水晶报表根据指定的驱动连接数据库并直接将需要的数据“拉”进报表。使用该模式时,与数据库的连接和为了获取数据而执行的SQL命令均由Crystal Reports自行处理,不需编写代码。9.2.2以拉模式实现水晶报表以拉模式实现水晶报表主要包括以下步骤:根据用户需求确定报表基本内容,设计纸张原型。在.NET项目中创建Crystal报表文件,用向导配置数据源。利用
6、Crystal Reports Designer修改报表布局。向Web窗体添加CrystalReportViewer控件,并将创建的Crystal报表绑定到CrystalReportViewer控件。【例9.1】采用拉模式实现一个学生名册报表。报表的显示内容和布局如图,报表中包括学生姓名、性别、生日和联系电话数据项;报表顶端显示“东华大学”和“学生名册”;在页面左上方显示打印日期;在页脚处显示“第N页 共M页”。(1)创建Crystal报表文件使用Crystal Reports建立报表文件(*.rpt)的步骤:新建Crystal报表文件。在解决方案资源管理器中,右击网站项目名称,选择“添加新项
7、”命令,在“添加新项”对话框中,“模板”选择“Crystal报表”、“名称”后输入报表文件名,默认文件名为CrystalReport.rpt,单击“添加”按钮。选择报表创建选项。选择数据源。指定数据源连接的信息。选择用于建立报表的数据表。选择要在报表中显示的数据字段。在分组(将报表中的信息分组)和记录选定(选择要显示的信息子集)对话框中,根据需求做相应的选择。在报表样式对话框中,为报表选择格式化样式。提示提示:第一次创建Crystal报表文件时,会出现“Crystal Reports最终用户许可证”对话框,要求用户接受许可协议,选择接受许可即可。(2)利用Crystal Reports Des
8、igner修改报表布局。在“报表页眉”处右击,选择“报表/节专家”菜单进入“节专家”对话框,不选中“抑制显示(无向下钻取)”;选“插入/文本对象”菜单,填写文本“东华大学”,在属性窗口设置字体为“宋体“、”四号”、“粗体”。在“页眉”处右击,选择“插入/文本对象”菜单,填写文本“学生名册”,在属性窗口设置字体为“宋体四号”。在“页眉”节将标题分别修改为:学生姓名、性别、生日、联系电话。将详细资料节下边框向下稍拖,以便拉开行间距离,选“插入/线”在下面划一条线作为页眉分割线,右击Birthday选“设置对象格式”,在“日期和时间”中选“1999年03月01日”。在“报表页脚”节删除“页码”项,右
9、击选“插入/特殊字段/第N页,共M页”,居中。单击“主报表预览”标签,查看报表显示结果。新建一个ASP.NET Web窗体页面:StuReport.aspx。从工具箱的“Crystal Reports”组中拖动CrystalReportViewer控件至StuReport.aspx的设计页面中。在CrystalReportViewer的任务菜单中选择“选择报表源”下拉列表框中的“新建报表源”命令,出现“创建报表源”对话框,在“为CrystalReportSource控件指定Crystal报表”下拉列表框选择刚创建的“CrystalReport.rpt”文件。(4)运行应用程序,查看报表显示结果
10、。提示提示:注意首先在解决方案资源管理器中选中StuReport.aspx为当前页,再运行;因为浏览报表的CrystalReportViewer在StuReport.aspx页上,而报表文件不能作为页面。(3)添加CrystalReportViewer控件并绑定数据报表文件。9.2.3水晶报表设计环境1关于报表创建选项 1 1)使用报表专家)使用报表专家作为创建报表的向导,一步一步引导快速创建报表。Crystal Reports提供标准、套用信函、窗体、交叉表、子报表、邮件标签、深化等各类报表专家供选用。2 2)作为空白报表)作为空白报表从头开始创建报表。用于当需要具有完全的灵活性和控制能力,
11、想要从头开始创建报表时,或当报表类型与向导中许多可用的报表类型都不同的情况。3 3)来自于现有的报表)来自于现有的报表基于某个已经存在的一个报表为模型而生成新报表。通过选择“来自于现有的报表”选项来打开作为模型的一个报表,并使用“文件”菜单上的“另存为”命令将其保存为新文件。数据数据:为报表选择数据源和数据表。可以选择的数据源包括:2报表向导l 项目数据项目数据:当前连接的数据源列表和添加到当前项目中的AOD.NET数据集。l OLE DB(ADO):使用OLE DB提供程序的列表。l ODBC(RDO):使用ODBC数据源的列表。l 数据库文件数据库文件:本地驻留的数据库的列表。l 收藏夹收
12、藏夹:在“收藏夹”列表中维护的数据源的列表。l 历史记录历史记录:近期使用的数据源列表(一般显示5个)。l 更多数据源更多数据源:可通过本机驱动程序访问的其他数据源。作为创建报表的向导可以快速创建报表。由若干选项卡组成,指导用户一步步创建指定的报表。“链接”:如果在“数据”中选择了两个或更多的表,将出现报表创建向导“链接”步骤,用于设置和显示新报表中多个表之间的联接关系。“字段”:选择要包含在报表中的字段。“分组”:指定在报表上显示数据时的分组依据字段,是向导中的一个可选步骤。“汇总”:对已分组的数据选择要进行小计(求和、平均值、最大值、最小值、计数等)、添加百分比以及总计等运算的字段。创建汇
13、总字段是向导中的一个可选步骤。“组排序”:对在“分组”步骤中创建的组进行排序。可将所有组进行排序;也可选前五个组或后五个组进行排序,并可选择排序所基于的汇总字段。本步骤可选,仅当在“分组”步骤中指定了一个组并在“汇总”选项卡中指定了一个汇总时,才会出现。“图表”:在报表中创建图表是向导中的一个可选步骤。可以选择插入到报表中的各种不同图表类型、指定图表的标题等。“记录选定”:使用记录选定公式和参数筛选要包含在报表中的记录,是向导中的一个可选步骤。“报表样式”:从预定义的格式化样式中选择要在报表中使用的样式。(1)报表页眉报表页眉 :只在报表开头输出显示一次。此节用于显示报表的标题等报表开始位置出
14、现的信息。(2)页眉:页眉:输出显示在每个新页的开始位置。此节通常用于显示包括章节名、文档名称和其它类似信息。还可以用于显示报表上字段上方的字段标题。在报表中这些字段标题将作为标签显示在字段数据列的顶部。(3)详细资料详细资料 :随每条新记录输出显示。此节包含报表正文数据。(4)页脚页脚 :输出显示在每页的底部。此节通常包含页码等出现在每页底部的信息。(5)报表页脚:报表页脚:只在报表的结束位置输出显示一次。此节可用来包含希望只在报表的末尾出现一次的信息(如总计)。3水晶报表的布局在Crystal Report Designer中,一般有五个报表节:(6)其他报表节 如果将组、汇总或小计添加到
15、报表,则水晶报表设计器中会增加另外两个节:组页眉和组页脚组页眉和组页脚。“组页眉”节出现在“详细资料”部分的正上方,而“组页脚”节出现在“详细资料”部分的正下方。跟原始报表节一样,每个新添加的节也可以包含一个或多个子节。默认情况下,它们都只包含一个节。组页眉:组页眉:输出显示在每个新组的开始位置。此节通常保存组名字段,也可以用来显示包括组特定数据的图表或交叉表。组页脚:组页脚:输出显示在每组的结束位置。此节通常保存汇总数据,也可以用来显示图表或交叉表。“组页脚”节在每组的结束位置输出显示一次。3水晶报表的布局【例9.2】采用“拉”模式实现一个有分组汇总的报表,课程成绩汇总表,要求按课程分组显示
16、每个学生的成绩,并统计各课程的平均成绩。(1)建立一个新的ASP.NET Web网站或打开一个已存在的ASP.NET Web网站。(2)在该网站中创建水晶报表,指定数据源连接信息为School数据库。(3)在报表向导中设计报表内容。选择用于建立报表的数据表。选择要在报表中显示的数据字段 指定报表中信息的分组依据 指定报表中的汇总信息 调整水晶报表的布局 新建一个ASP.NET Web窗体页面GradeList.aspx,在页面添加CrystalReportViewer控件,选择上面创建的.rpt报表文件作为CrystalReportViewer控件的报表源。运行应用程序,查看报表显示结果。在已
17、存在的报表上添加字段:可从窗口左边的“字段资源管理器”中直接拖动所需字段到报表上。【报表】/【选择专家】:选择符合条件的记录,显示在报表上。【报表】/【报表专家】:对报表进行重新设计,现有报表的定义将被替换。【数据库】/【添加/删除数据库】:浏览数据源以查找需要添加到报表中的表。【数据库】/【登录/注销服务器】:在“数据资源管理器”中进行新的连接或注销已有的连接。9.2.4以推模式实现水晶报表 根据用户需求确定报表基本内容,设计纸张原型。在.NET项目中通过数据表适配器向导创建数据集DataSet为报表提供数据源。在.NET项目中创建Crystal报表文件,报表的数据源选择“项目数据”中的“A
18、DO.NET数据集”,使用步骤中创建的数据集为数据源。利用Crystal Reports Designer修改报表布局:修改显示样式和格式。向Web窗体添加CrystalReportViewer控件,并通过程序代码实现将数据集数据推送给报表,以及设置所创建的报表为CrystalReportViewer控件的报表源。在推模式实现水晶报表时,首先需要创建与报表中的字段相匹配的数据集DataSet,然后将该数据集“推”送至报表。主要步骤如下:【例9.3】采用推模式实现例9.2的课程成绩汇总表。在解决方案资源管理器中添加新项,选择“数据集”模板,命名为DataSetGrade。系统提示“是否将Data
19、Set放入APP_Code文件夹”,选择“是”,则创建的数据集放在APP_Code文件夹,可以被应用程序共享。随后在编辑区会出现“DataSetGrade窗口”,并自动进入“TableAdapter配置向导”。建立一个新的ASP.NET Web网站或打开一个已存在的ASP.NET Web网站。通过数据表适配器(TableAdapter)配置向导创建数据集DataSetGrade。数据集创建的步骤与SqlDataSource相似。主要是生成数据集的查询,该查询涉及三个表Student、Course和Grade表,可以使用查询生成器,或直接输入SQL语句,配置完成的数据集。SELECT Cours
20、e.CourseCode,Course.CourseName,Student.StudentCode,Student.StudentName,Grade.GradeFROM Course INNER JOIN Grade ON Course.CourseCode=Grade.CourseCodeINNER JOIN Student ON Grade.StudentCode=Student.StudentCode 在该网站中新建报表CrystalReport。仍用“标准报表专家”向导;只是在选择“可用的数据源”时,选“项目数据”中的“ADO.NET数据集”中本例新建的数据集对象DataSetGr
21、ade中的DataTable1作为数据源,后续操作同例9.2完成报表设计。拖CrystalReportViewer控件至GradeListPush.aspx的页面。编写如下的程序代码将数据集中的数据推送到CrystalReport、并设置CrystalReport为CrystalReportViewer的报表源:protected void Page_Load(object sender,EventArgs e)/创建自定义类型的数据集,创建TableAdapter,填充数据 DataSetGrade ds=new DataSetGrade();DataSetGradeTableAdapter
22、s.DataTable1TableAdapter dta=new DataSetGradeTableAdapters.DataTable1TableAdapter();dta.Fill(ds.DataTable1);/定义ReportDocument对象,加载报表 CrystalDecisions.CrystalReports.Engine.ReportDocument oCR=new CrystalDecisions.CrystalReports.Engine.ReportDocument();oCR.Load(Server.MapPath(/CrystalReport.rpt);oCR.S
23、etDataSource(ds);/设置为CrystalReportViewer1的报表源 CrystalReportViewer1.ReportSource=oCR;运行应用程序,查看报表显示结果。9.3在水晶报表中增加数据图表用“标准报表创建向导”创建新报表时,在“图表”步骤可向报表添加图表;或者在Crystal Report Designer中向数据报表添加图表。1在数据报表顶部增加图表【例9.4】在例9.2的课程成绩汇总表顶部增加各门课程平均分对比表。在报表页眉节右击选择“插入/图表”命令,打开“图表专家”对话框。l在“类型”选项卡处选择图表类型,这里选条形图中的并排条形图;l在“数据
24、”选项卡处选择显示内容,因为数据报表已有分类汇总,所以本图表默认以汇总结果为图表内容;l在“文本”选项卡查看和修改各类标题及格式。这里将标题修改为“各门课程平均分对比表”、组标题为“课程号”、数据标题为“平均分”。运行程序,即可得到所显示的包含了图表的数据报表。图表专家中选择图表类型、显示数据、各图表项格式等。2使用“图表专家”编辑图表 右击图表选择“图表专家”命令,可打开“图表专家”。默认情况下,“图表专家”有“类型”、“数据”和“文本”3个选项卡。如果不勾选“类型”选项卡中的“自动设置图表选项”复选框,“图表专家”将增加“坐标轴”和“选项”2个选项卡。(1)“类型类型”选项卡选项卡提供可插
25、入到报表中的不同图表类型,例如条形图、线图、面积图、饼图等等,每一类图表又有多个子类。(2)“数据数据”选项卡选项卡包含三部分:位置、布局、数据。“位置”处说明图表放在报表中的位置(页眉/页脚),以及图表出现的频率。“布局”根据制图数据确定图表的布局:高级、组、交叉表、OLAP。数据选择显示内容。(4)“选项选项”选项卡选项卡提供显示图表的图表颜色、数据点、透明背景、标记大小、标记形状、查看角度、饼图大小、条形图大小、拆分饼图、图例等设置选项。(3)“坐标轴坐标轴”选项卡选项卡用于设置每个图表轴的属性。该卡因所创建的图表类型而异,可用来自定义图表的某些属性,如坐标轴的刻度、图例、数据点等。(5
26、)“文本文本”选项卡选项卡用于指定图表的标题、副标题、脚注、轴标题和系列标题,并可设置字体选项的文本格式。(1)将新的模板应用到图表。(2)更改图表的模板规范。(3)更改图表标题。(4)更改图表的数轴网格和刻度。(5)设置所选图表的格式。4使用“格式化编辑器”编辑图表 在Crystal Report Designer中右击图表,选择“设置对象格式”命令,可使用“格式化编辑器”对图表设置格式、边框、超级链接等。3使用“图表选项”编辑图表 在Crystal Report Designer中右击图表,选择“图表选项”可看到“模板”、“常规”、“标题”、“网格”等命令菜单,可对图表进行如下编辑操作:5
27、在图表上使用延伸功能【例9.5】将例9.4中数据报表头部“各门课程平均分对比表”显示在数据表右侧。一般创建的图表在报表的页眉或页角。如果想放置在其他位置,可以使用延伸功能来控制位置。为了在数据报表右侧空出一定位置显示图表,在Crystal Report Designer中对数据表进行重新布局,使其更紧凑。在Crystal Report Designer中右击任一报表节,选择“报表/节专家”命令,在出现“节专家”对话框中,在左侧的“节”区域中,单击目前图表所在的位置“报表页眉a”,然后选中“延伸到后续节”复选框,单击“确定”按钮。回到Crystal Report Designer中,在“报表页眉
28、a”节中适当移动图表,模仿纸张位置放到中部右侧或调整其大小,即可实现图表延伸功能。9.4水晶报表的浏览、导出与打印Crystal Reports允许以不同视图查看、打印和导出报表,有两种方法。一是用CrystalReportViewer控件提供的工具菜单;另一是使用.NET提供的ReportDocument对象编写程序实现。1使用CrystalReportViewer查看、导出与打印报表(1)浏览报表可选“视图比例”放大或缩小页面显示;利用“前后翻页”对应的四个按钮转到不同的页;如果是有分组汇总功能的页面,可用“显示/隐藏组树”显示或隐藏左侧的分组导航列表,点击列表中的一项,即显示该分组位置附
29、近的数据。使用查找功能可在所有页面内查找指定的文本,显示该位置附近的数据。(2)导出报表报表可以多种常用格式导出,如Crystal Reports(.rpt)、Adobe Acrobat(.pdf)、电子表格格式Microsoft Excel(.xls)、字处理器格式Microsoft Rich Text(.rtf)或Microsoft Word(.doc)等。(3)打印报表点击“打印“按钮后,出现“打印报表”对话框,选择打印页码范围,按“确定”后,启动文档类型相关的程序,即可使用的打印功能输出报表,也可保存为文档。2使用ReportDocument对象编写报表导出程序【例9.6】采用编程方式
30、将例9.3推模式创建的报表导出为“D:Report.PDF”文件。(1)在GradeListPush.aspx页面上增加1个Button1,Text属性设置为“导出报表”。(2)程序代码如下:添加对命名空间的引用,以支持ReportDocument和ExportFormatType。using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.Shared;页面加载时显示报表,为了使“导出报表”按钮事件过程能共用页面加载时加载的ReportDocument对象oCR(已推送数据),这里将其定义为页面内公共变量。publi
31、c partial class _Default:System.Web.UI.Page /定义页面内可使用的公共变量ReportDocument对象oCR CrystalDecisions.CrystalReports.Engine.ReportDocument oCR=new CrystalDecisions.CrystalReports.Engine.ReportDocument();protected void Page_Load(object sender,EventArgs e)/创建自定义类型的数据集,创建TableAdapter,填充数据 DataSetGrade ds=new
32、DataSetGrade();DataSetGradeTableAdapters.DataTable1TableAdapter dta=new DataSetGradeTableAdapters.DataTable1TableAdapter();dta.Fill(ds.DataTable1);/为ReportDocument对象oCR加载报表当前应用程序路径下的CrystalReport.rpt oCR.Load(Server.MapPath(/CrystalReport.rpt);oCR.SetDataSource(ds);/设置为CrystalReportViewer1的报表源 Cryst
33、alReportViewer1.ReportSource=oCR;protected void Button1_Click(object sender,EventArgs e)/设置导出文档的路径和文件名设置导出文档的路径和文件名 string DiskFileName=D:Report.pdf;/*将文件导出,此处设置导出文档的格式为将文件导出,此处设置导出文档的格式为pdf格式(格式(PortableDocFormat),),也可设为其他格式也可设为其他格式*/oCR.ExportToDisk(ExportFormatType.PortableDocFormat,DiskFileName)
34、;【例9.7】采用编程方式将例9.1拉模式创建的报表导出为“D:Report.xls”文件。点击“导出报表”按钮,导出报表。如果是采用拉模式创建的报表,导出功能相似。using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.Shared;protected void Button1_Click1(object sender,EventArgs e)/定义ReportDocument对象oCR,加载报表 CrystalDecisions.CrystalReports.Engine.ReportDocument oCR=new CrystalDecisions.CrystalReports.Engine.ReportDocument();oCR.Load(Server.MapPath(/CrystalReport.rpt);/设置导出文档的路径和文件名 string DiskFileName=D:Report.xls;/将报表导出,此处设置导出文档的格式为xls格式(Excel),也可设为其他格式 oCR.ExportToDisk(ExportFormatType.Excel,DiskFileName);在GradeListPush.aspx页面增加Button1,其Text属性设为“导出报表”,代码如下: