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