当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

第16章报表是如何生成的——水晶报表

8/31/2020 9:10:17 PM 人评论

第16章报表是如何生成的——水晶报表

第16章 报表是如何生成的——水晶报表

本章视频教学录像:29分钟

水晶报表是内置于 Visual Studio.NET 开发环境中的报表设计工具,它能够帮助程序员在.NET平台上创建复杂且能够互动的报表,还有显示图表等多种功能。

本章要点(已掌握的在方框中打钩)

□ 水晶报表基本知识

□ 水晶报表的数据交换

□ 水晶报表的相关操作

16.1 水晶报表简介

本节视频教学录像:10分钟

当你需要用报表、图表时,你首先想到的应该就是用Excel去绘制,但是如何在web中显示报表或者是图表呢?答案将在本章揭晓。

16.1.1 什么是水晶报表

水晶报表(Crystal Reports)是一款商务智能(BI)软件,主要用于设计及产生报表。水晶报表是最专业、功能最强的报表系统,它除了强大的报表功能外,还可以绘制不同行业的图形(如流程图、工程图),其最大的优势是实现了与绝大多数流行开发工具的集成和接口。

水晶报表几乎可以从任何数据源生成所需要的报表。内置报表专家在生成报表和完成一般的报表任务过程中,会一步一步地指导操作。报表专家通过公式、交叉表、子报表和设置条件格式等帮助表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字确实不够充分,则用地理地图和图形进行形象的信息交流。

水晶报表支持几乎所有的常用数据库,如 IBM DB2, Microsoft Access, Microsoft SQL Server, MySQL, 还有数据表如Microsoft Excel,文本文件HTML XML文件。通过网络服务ODBC, JDBC 或者OLAP可访问的任意数据源。

16.1.2 水晶报表的分类

水晶报表按分发方式分为嵌入式和非嵌入式。

嵌入式报表具有与.rpt文件对应的同名包装类,直接通过代码与包装类进行交互,而不是与原始报表文件本身进行交互。非嵌入式报表则单独以.rpt文件形式存在报表,该报表不包含在项目内,也没有对应的报表包装类。

对于嵌入式报表,系统对项目进行编译时,与其他项目资源一样,报表和其包装类都会被自动嵌入到程序集中,用户看不到被包装后的.rpt文件。对于非嵌入式报表,如果是ASP.NET网站,要求该.rpt文件保存在网站根目录下,如果是Windows应用程序则要求分发后.rpt文件保存在和.exe文件相同的目录下。

对于嵌入式报表,如果修改了报表内容,必须重新编译整个项目。非嵌入式报表修改了报表内容,无需重新编译整个项目。

在嵌入式水晶报表设计器内,可以直接通过拖放方式将一个报表对象(如数据库字段或文本对象)拖动到设计器上,然后使用“属性”窗口或快捷菜单格式化该对象;可以定义该表的数据源,选择要使用的数据记录并对其进行分组,设置报表对象的格式及布局。

16.1.3 报表节

对于一张新建的Crystal报表,报表设计区主要分为5部分,分别为报表头、页眉、详细资料、报表尾和页脚,如图所示。

figure_0388_0659

1. 报表头

⑴该区域中的信息和对象只在报表的开头显示一次。

⑵该区域通常包含Crystal报表的标题和其他只在Crystal报表开始位置出现的信息。

⑶放在该区域中的图标和交叉表包含整个Crystal报表的数据。

⑷放在该区域中的公式只在Crystal报表开始进行一次求值。

2. 页眉

⑴该区域中的信息和对象显示在每个新页的开始位置。

⑵该区域通常包含只出现在每页顶部的信息,例如文本字段和字段标题等。

⑶图表或交叉表不能放在该区域。

⑷放在该区域中的公式在每个新页的开始进行一次求值。

3. 详细资料

⑴该区域中的信息和对象随每条新记录显示。

⑵该区域包含Crystal报表正文数据,例如批量报表数据通常出现在该区域。

⑶图标或交叉表不能放置在该区域中。

⑷放在该区域中的公式对每条记录进行一次求值。

4. 报表尾

⑴该区域中的信息和对象只在Crystal报表的结束位置显示一次,如统计信息。

⑵该区域的图表和交叉表包含整个Crystal的数据。

⑶该区域中的公式只在Crystal报表的结束位置进行一次求值。

5. 页脚

⑴该区域中的信息和对象显示在每页的底部。

⑵该区域通常包含页码和任何希望出现在每页底部的信息。

⑶放在该节中的公式,在每页结束位置进行一次求值。

⑷如果将组、摘要或小计添加到Crystal中,则程序会自动创建组页眉和组页脚两个区域。

6. 组页眉

⑴放在该区域中的对象显示在每个新组的开始位置。

⑵该区域通常保存组名字段,可以用来显示包括特定数据的图表或交叉表。

⑶放在该区域的图标和交叉表仅包含本组数据。

⑷放在该区域的公式在每组的开始位置对本组进行一次求值。

7. 组页脚

⑴放在该区域中的对象显示在每个新组的结束位置。

⑵该区域通常保存汇总数据,也可以用来显示图表或交叉表。

⑶放在该区域的图标和交叉表仅包含本组数据。

⑷放在该区域的公式在每组的结束位置对本组进行一次求值。

16.1.4 在Visual Studio 2010中安装水晶报表

Crystal Report自1993年以来就已成为Visual Studio的一部分,在Visual Studio2010之前都是默认包含水晶报表的,但在Visual Studio 2010中默认不包含水晶报表。所以我们在此简单介绍一下水晶报表的安装。

首先是在SAP官方网站上下载Crystal Report for Visual Studio 2010安装文件,地址如下:http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_13_0.exe。

下载完成,按照默认的设置安装,重启Visual Studio 2010。

提示

安装完成以后,左侧的工具栏中可能没有添加上CrystalReportViewer控件,这时需要将项目的目标框架由“.NET Framework 4 Client Profile”修改为“.NET Framework 4”,该操作可以通过选中项目,右键单击并选择属性的方式修改。

16.2 水晶报表的数据交换

本节视频教学录像:6分钟

Crystal 水晶报表通过数据驱动程序与数据库进行连接,用户可以选择下列数据源中的数据进行报表设计:

⑴使用ODBC驱动程序的任何数据库(RDO)。

⑵使用OLEDB驱动程序的任何数据库(ADO)。

⑶Microsoft Access数据库或Excel工作簿(DAO)。

⑷ADO.NET记录集。

16.2.1 水晶报表对象模型

对象模型是指构成编程模型的核心类及周围类,主要有以下三个。

1. CrystalReportViewer对象模型

CrystalReportViewer控件包含可用于控制该控件如何显示报表的属性和方法,以及少量的与绑定到该控件的报表进行交互的属性和方法。这些属性和方法构成了一个功能有限的CrystalReportViewer对象模型。

CrystalReportViewer控件仅用于控制报表显示的形式,比如控制显示缩放比例等。而要与报表内部进行交互,则应该使用封装后的其他对象模型。即尽量不要使用CrystalReportViewer对象提供的属性与方法与报表内部进行交互。

2. ReportDocument对象模型

ReportDocument对象模型比CrystalReportViewer功能多、范围广。该对象模型提供了在代码中处理报表的各种功能。它起到通道的作用,是通向 Engine 命名空间的一组类,这些类为通过编程方式对报表进行操作提供了更多工具。

在对象模型的下一个级别,将在把报表赋给该控件之前,使用 ReportDocument 对象模型将报表封装到一个 ReportDocument 实例内。这样就可以访问 ReportDocument 中提供的更为复杂和强大的对象模型了。

3. ReportClientDocument对象模型

ReportClientDocument 对象模型由跨多个命名空间的许多类组成。每个命名空间的前缀均为CrystalDecisions.ReportAppServer。此对象模型在 SDK 中提供整个报表结构,使用户能够通过编程方式在运行时创建和修改报表的每个方面,并保存所做的更改。

在 Crystal Reports 10 中,ReportDocument和ReportClientDocument对象模型已经不再是彻底分开的。通过重写 ReportDocument 对象模型以作为 ReportClientDocument 对象模型中功能的代理(子集),已经实现了这一点。ReportDocument 对象模型的类提供的属性和方法签名与以前相同,但其基础功能已更改为将每个属性和方法重定向到功能更强大的 ReportClientDocument 对象模型的属性和方法。

16.2.2 Crystal报表数据源和数据访问模式

水晶报表最常用的两种报表数据源访问模式是提取模式(Pull Model)和推入模式(Push Model),本节将介绍这两种访问模式。

1. 提取模式

提取模式是指驱动程序自动连接至数据库并视需要来提取数据。当采用提取模式时,水晶报表本身将自行连接数据库并执行用来提取数据的SQL命令,开发人员不需要另外编写代码。若采用提取模式,则只能访问ODBC、OLEDB与Access/Excel数据源。

【范例16-1】提取模式使用SQL Server数据库。

⑴创建一个ASP.NET空网站,在【解决资源管理器】上单击,选择【添加新项】,选择【Crystal Reports】。在随后出现的对话框中单击【确认】按钮。

figure_0390_0660

⑵在【标准报表创建向导】对话框中选择【OLEDB(ADO)】。

figure_0391_0661

⑶在出现的【OLE DB(ADO)】窗口中选择【SQL Native Client 10.0】,单击【下一步】按钮。

figure_0391_0662

⑷在出现的【连接信息】对话框中,输入相应的数据,单击【下一步】按钮,然后点击【完成】按钮。

figure_0391_0663

⑸把相应的表添加进去,单击【下一步】按钮。

figure_0392_0664

⑹在【字段】对话框中,把要显示的字段加入进去。

figure_0392_0665

⑺单击【下一步】按钮直到出现【分组】对话框,根据需要可对数据进行分组。再单击【下一步】按钮直到出现【记录选定】字段,可以进行筛选。再次单击【下一步】按钮直到出现【报表样式】对话框,选择相应样式,单击【完成】按钮。

figure_0392_0666

⑻添加一个Default.aspx的页面并切换到设计视图,在视图中添加一个CrystalReportViewer控件,单击右上角的按钮,对报表源进行配置。

figure_0393_0667

【运行结果】

按【Ctrl+F5】组合键运行,如下图所示。

figure_0393_0668

【范例分析】

在本范例中,在【连接信息】对话框中应该填入的是本机器上的相应信息。例如服务器,它应该是本地机器上SQL Server 2008的服务器,用户名和密码也分别是本地机器SQL Server 2008上已经存在的用户名和密码。

2. 推入模式

相对于提取模式,若采用推入模式,开发人员必须自行编写代码来连接到数据库,通过执行SQL命令来创建数据集或数据记录集,并将该对象传递给报表。采用推入模式的好处就是开发人员对数据库拥有更大的自主权与控制权,同时可以使用ADO.NET、CDO、DAO与RDO来访问各种类型的数据源。

【范例16-2】推入模式使用SQL Server数据库

⑴创建一个ASP.NET空网站,新添加一个【数据集】。在随后出现的对话框中单击【确认】按钮,在出现的页面上单击右键,【添加】figure_0393_0669【TableAdapter】。

⑵单击新建连接,在【添加链接】的对话框中选择【更改】按钮,在出现的【更改数据源】对话框中选择【Microsoft SQL Server】选项。单击【确认】按钮,回到【添加链接】对话框,输入相应的服务器名称和用户名、密码、要连接到的数据库等信息,连接成功后,单击【确定】按钮。

figure_0394_0670

⑶在出现的【选择命令类型】对话框中选择【使用SQL语句】,单击【下一步】按钮。

figure_0394_0671

⑷在【输入SQL语句】对话框中,单击【查询生成器】按钮,在出现的框体中添加相应的表,然后选择要显示的列。单击【确认】按钮,回到【输入SQL语句】对话框,将看到自动生成的SQL语句,然后单击【完成】按钮。

figure_0394_0672

⑸新添加一个水晶报表。按例16-1进行配置。配置完成后在右侧的【字段资源管理器】中【数据库字段】上单击右键,选择【数据库专家】。在弹出的对话框中,选择【项目数据】figure_0395_0673【ADO.NET数据集】figure_0395_0674【DataSet1】figure_0395_0675【studentinfo】。单击【确认】按钮。

figure_0395_0676

⑹在Default.aspx页面中添加一个CrystalReportViewer控件,并在Page_Lord中添加以下代码。

01 protected void Page_Load(object sender,EventArgs e)

02 {

03  string s= "Server=FSS-PC;DataBase=Student;Uid=sa;PWD=sa";

04 SqlConnection con= new SqlConnection(s);

05 con.Open();

06  string strsql= "select * from studentinfo";

07 SqlDataAdapter adapter= new SqlDataAdapter(strsql, con);

08 DataSet1 ds= new DataSet1();

09 adapter.Fill(ds, "studentinfo");

10 ReportDocument studentReport= new ReportDocument();

11  studentReport.Load(Server.MapPath("CrystalReport.rpt"));

12  studentReport.SetDataSource(ds);

13   this.CrystalReportViewer1.ReportSource= studentReport;

14 }

【运行结果】

按【Ctrl+F5】组合键运行,如下图所示。

figure_0395_0677

【范例分析】

在本范例中,通过直接在Page_Load()中添加代码的形式把数据源绑定到了CrystalReportViewer上,从而不必再在页面为CrystalReportViewerusing配置数据源。另外此段代码中需要引入 System. Data.SqlClient,using CrystalDecisions.CrystalReports.Engine。

16.3 Crystal报表数据相关操作

本节视频教学录像:10分钟

本节介绍Crystal报表数据的相关操作。

16.3.1 水晶报表中的数据分组与排序

水晶报表中升序和降序的排序规则如下:

⑴“文本”升序排序。

空白;标点符号;0-9;A-Z(相同字母的,大写排序在前,小写排序在后);中文字符按其拼音字母A-Z的顺序来排。

⑵“日期/时间”升序排序。

空日期排在最前,较早的日期其次,较晚的日期最后。

⑶“数字/货币”升序排序。

较小的数值排列在前,较大的数值排列在后。

⑷“布尔值”升序排序。

true在前,false在后。

【范例16-3】水晶报表中数据分组与排序的应用。

⑴创建一个ASP.NET空网站,添加一个水晶报表。按照例16-1配置水晶报表。

⑵在水晶报表空白处单击右键,选择【报表】figure_0396_0678【组专家】。在弹出的对话框中,从左边可用字段中选择相应的字段,单击【确定】按钮。

figure_0396_0679

⑶在水晶报表空白处单击右键,选择【报表】figure_0396_0680【记录排序专家】,在弹出的对话框中,从左边可用字段中选择相应的字段和排序方式,单击【确定】按钮。

figure_0397_0681

⑷添加一个Default.aspx的页面并切换到设计视图,添加一个CrystalReportViewer控件,配置报表源。

【运行结果】

按【Ctrl+F5】组合键运行,如下图所示。

figure_0397_0682

16.3.2 水晶报表中数据的筛选

默认情况下,数据源中的所有记录都将显示在报表上,但在实际应用中,可能仅仅需要显示符合条件的记录,这时就需要对记录进行筛选。一般情况下,可以用以下两种方法来筛选记录。

1. 利用内嵌的“选择专家”筛选记录

【范例16-4】利用内嵌的“选择专家”进行记录的筛选。

⑴创建一个ASP.NET空网站,添加一个水晶报表。按照例16-1配置水晶报表。

⑵在水晶报表空白处,单击右键,选择【报表】figure_0397_0683【选定公式】figure_0397_0684【记录】。在弹出的对话框中输入相应的公式,检查无误后,单击【保存并关闭】按钮。

figure_0397_0685

⑶添加一个Default.aspx页面并切换到设计视图,添加一个CrystalReportViewer控件,配置报表源。

【运行结果】

按【Ctrl+F5】组合键运行,如下图所示。

figure_0398_0686

2. 开发人员自定义公式筛选记录

在报表设计环境空白处单击右键,选择【报表】figure_0398_0687【选择专家】figure_0398_0688【记录】,在弹出的对话框中输入有限制条件的公式,检查无误后保存并关闭,完成记录的筛选工作。

提示

公式的返回值必须是boolean类型的,即“true”或“false”。

【范例16-5】利用选择专家进行记录的筛选。

⑴创建一个ASP.NET空网站,添加一个水晶报表。按照例16-1配置水晶报表。

⑵在水晶报表空白处单击右键,选择【报表】figure_0398_0689【选择专家】figure_0398_0690【记录】。在弹出的对话框中选择相应的条件,单击【确认】按钮。

figure_0398_0691

⑶添加一个Default.aspx页面并切换到设计视图,添加一个CrystalReportViewer控件,配置报表源。

【运行结果】

按【Ctrl+F5】组合键运行,如下图所示。

figure_0399_0692

【范例分析】

在本范例中,我们通过编辑选择姓“李”的记录,这只是非常简单的例子,读者还可以通过下面的一些公式模板,编辑更复杂的选择公式来选择所需要的记录。

常用的一些公式模板如下表所示。

figure_0399_0693

16.3.3 创建和使用水晶图表

图表的使用可以使说明变得简单、易懂,水晶报表作为一个应用于各个领域的强大的商务智能软件,理所当然地包含了图表的使用。

【范例16-6】在水晶报表中使用图表。

⑴创建一个ASP.NET空网站,添加一个水晶报表。按照例16-1配置水晶报表。

⑵在水晶报表空白处单击右键,选择【插入】figure_0400_0694【图表】,选择摆放的位置后弹出【图表专家】对话框。在类型中选择图标的种类。

figure_0400_0695

⑶切换至【数据】选项卡,在【变更主体】中添加相应的可用字段(相当于确定横轴),在【显示值】中添加相应的选项(相当于纵轴)。最后根据需要去改变【文本】等其他选项。

figure_0400_0696

⑷添加一个Default.aspx页面并切换到设计视图,添加一个CrystalReportViewer控件,配置报表源。

【运行结果】

按【Ctrl+F5】组合键运行,如下图所示。

figure_0400_0697

【范例分析】

在本范例中,比较容易混淆的是图标的横纵坐标的确定,所以在自己编写时要特别注意。

16.3.4 创建和使用子报表

子报表是指内含于报表中的报表,内含子报表的报表称为主报表(或父报表)。在这种报表中,主报表和子报表之间会彼此相连,这样子报表就仅能显示与主报表有关的数据记录。子报表除了可以直接内嵌于主报表之外,还可以通过超链接的方式打开。

1. 内嵌型的子报表

【范例16-7】在水晶报表中使用子报表。

⑴创建一个ASP.NET空网站,添加一个水晶报表。按照例16-1配置水晶报表。

⑵在水晶报表空白处单击右键,选择【插入】figure_0401_0698【子报表】,选择摆放的位置后弹出【插入子报表】对话框,在【新建报表名称】处输入报表名。

figure_0401_0699

⑶然后单击【报表向导】,新建一个报表,把相应的数据源加到新建的报表上。切换至【链接】,选择链接用的字段。

figure_0401_0700

⑷添加一个Default.aspx页面并切换到设计视图,添加一个CrystalReportViewer控件,配置报表源。

【运行结果】

按【Ctrl+F5】组合键运行,如下图所示。

figure_0402_0701

2. 仅显示子报表

在以上例子的结果中,报表会显得比较繁杂,为了使报表显示更清晰明了,通常使用明细报表的形式,这就需要在主报表中使用连接的方式让用户选择,以便动态打开子报表。

【范例16-8】在水晶报表中仅显示子报表。

⑴创建一个ASP.NET空网站,添加一个水晶报表。按照例16-1用studentinfo表作为数据源,完成水晶报表配置。新建一个名为“CrystalReports2”的水晶报表,按照例16-1用grade表作为数据源配置水晶报表。

⑵在CrystalReports水晶报表空白处单击右键,选择【插入】figure_0402_0702【子报表】,选择摆放的位置后弹出【插入子报表】对话框,选中【在项目中选择Crystal报表】,在下拉框中选择“CrystalReports2”报表。

figure_0402_0703

⑶切换至【链接】,选择链接用的字段。

figure_0402_0704

⑷添加一个Default.aspx的页面并切换到设计视图,添加一个CrystalReportViewer控件,配置报表源。

【运行结果】

按【Ctrl+F5】组合键运行,如下图所示。

figure_0403_0705
figure_0403_0706

16.4 高手点拨

本节视频教学录像:3分钟

1. 如何动态修改水晶报表中的文本值

在Push模式下,可以通过如下代码动态修改水晶报表中的文本值:

ReportDocument ReprotDoc=new ReportDocument();

ReportDoc.Load(Server.MapPath(Crystal));

TextObject tb=(TextObject)ReportDoc.ReprotDefinition.ReportObjects[“Text1”];

Tb.text=”修改后的内容”;

2. 其他报表组件

水晶报表是我们经常用到的报表组件,除了水晶报表,还有一个报表也是我们经常用到的。就是微软自带的ReportViewer,ReportViewer完全免费,使用简单,非常容易上手。所见即所得,支持数据导出为Excel文件和PDF文件。

Stimulsoft Reports.Net是一款基于.NET的报表生成器,能够创建基于多种数据源的报表,创建的报表在Windows窗体和Asp.Net中都是可用的。已创建的报表可以导出为PDF、XML、HTML、Excel、RTF,以及TIFF等20多种格式的文件。

ReportViewer控件提供了很多报表的基本功能,但对稍微复杂点的报表运作效率就比较低,部署麻烦。如果要开发复杂的C#报表,建议用收费的Stimulsoft Reports.Net报表。

16.5 实战练习

创建一个网站,添加一个页面,在该页面实现可以通过选择性别来分别生成男女生的信息报表。

相关教程

共有条评论 网友评论

验证码: 看不清楚?