几乎在所有的应用程序中报表都是程序员头疼的问题。在.net环境下包含了功能强大的报表工具: Crystal Report。它能很好的与数据库交互,做出各种漂亮的报表和分析图表(具体功能下边文章会更详细的介绍).
事实上,今天的这篇文章是我前段时间为一家公司的讲课的课件,经过改版发表了出来希望能对所有在.net环境下开发报表的程序员一些帮助。由于我公司是做电子政务系统,所以严重的“中国式报表”巨多,所以我为为公司自己封装了一个报表控件,实现了报表单据中数据的录入、删除、显示、打印等功能。如有朋友预见类似的问题,我很乐意与你交流,共同学习。
e-mail:billzhangmingming@sina.com.cn
从1993年开始,Crystal Report 就是Visual Studio 套件中的一部分。目前实际上已成为Visual Studio.NET 中的报表标准,在Windows 报表编写领域中居于领先地位,推动着Web报表的未来发展。
最新的Visual Studio.NET 以集成开发环境(IDE)中整和了Crystal Report9.0,从而增强了Visual Studio.NET 的开发功能, Crystal Report 为开发人员提供了尽可能的API。
Crystal Report for .NET 的功能简介
通过将Crystal Report 的报表处理功能整和到自己的数据库应用程序中,应用程序和Web开发人员可以节省开发时间来满足用户的需求。Crystal Report 支持大多数流行的开发语言,可以方便的在任何应用程序中添加报表。
不论是IT行业的站点管理员,还是金融业、电信业的数据库管理员,Crystal Report 都堪称是一个功能强大的工具,它可以帮助每个人对数据进行分析和解析。
具体来说,Crystal Report的功能有以下几点:
**全面的数据库访问:
Crystal Report 中包括了超过35中数据源驱动,可以访问一种XML、企业和关系型数据库。
**广泛的设计格式与设计:
通过Crystal Report,用户可以将数据库转换为高度交互性内容。可以从100多中格式选项中进行选择、包括参数、映射、
交叉表和超级链接、用以强化报表的冲击力。
**强大的图表设计功能:
Crystal Report 可以在报表中包含多彩的、易读的图表(提供了非常丰富的报表类型,如:条形图、折线图、面积图、
饼图、干特图、股票图等)。
**灵活的应用集成技术:
Crystal Report 带有灵活的Java、COM和.NET SDK,以及可内嵌的Report Application Server,可将报表与企业Web应用
紧密地集成在一起。通过使用Crystal Report 的“零”客户端浏览器控制,能够为最终端拥护提供丰富的报表交互、创建
和修改功能。
**强大的报表导出:
Crystal Reprort 的所有的报表都可以导出多种不同的格式:包括XML、PDF、HTML、和Microsoft Excel。
Crystal Report 设计器的布局
**字段资源管理器:
列出该报表所有的字段,如:使用的数据库字段、参数字段、公式字段等。可以在此修改和删除字段对象。
**主报表窗口:
用来在报表窗口中显示主报表。对于包含子报表的报表,有主报表窗口和对每个的深化(通过双击)的子报表有一个子报
表窗口。可以通过右击报表窗口的任何空白位置来启动报表快捷菜单。
**水晶报表主工具栏:
包括记录选择、分类和文本对象格式化图标。可以对整个工具栏移动或改变大小。
**水晶报表插入工具栏:
可以插入汇总字段、组、子报表、图表和图片的图标。也可以在Crystal Report工具栏中单击鼠标来选择“插入”。
Crystal Report 的具体实例
**Crystal Report viewer(水晶报表查看器)
Crystal Report Viewer是在Visual Studio.NET中Windows 应用程序来访问和查看水晶报表的Windows窗体控件。类似其
他的Windows 窗体控件,增加Windows 窗体查看器可以非常方便的从Visual Studio.NET工具箱中拖动水晶报表查看器控件到Windows窗体设计试图。之后再指定水晶报表查看器中的水晶报表。
***一个使用Crysatl Report Viewer创建报表的Demo:
要在 Visual Basic 或 C# 项目中向 Windows 窗体添加 Windows 窗体 Viewer,请执行下列操作:
打开“工具箱”,并将一个 CrystalReportViewer 拖到窗体上。
通过拖放操作将 Windows 窗体查看器调整到希望的大小并将其移动到所需位置。
当运行应用程序时,报表将显示在查看器中。
与“工具箱”中的任何其他控件一样,如果想向 Windows 窗体查看器控件添加代码,请双击该控件以显示“代码”视图。
接下来,将报表绑定到 Windows 窗体查看器。
具体关于本Demo,我在Wiki上写了有关如何操作的一篇非常详细的文章,建议大家去看看。
**ReportDocument对象简介:
Crystal Reports 对象模型的顶级是 ReportDocument 对象。ReportDocument 包含与报表对接及自定义报表所需的所有 属性和方法。您既可使用其 Load 方法打开报表文件,也可为其分配一个强类型报表。
要使用 ReportDocument,您首先必须引用 CrystalDecisions.CrystalReports.Engine 命名空间 (可在 CrystalDecisions.CrystalReports.Engine.dll 中找到)。如果您已将报表插入应用程序中,则会自动添加此引用。
***一个具体使用ReportDocument对象创建动态加载报表的Demo:
向 CrystalDecisions.CrystalReports.Engine 添加引用
在代码编辑器中打开 Form1.cs。
在Form1窗体上添加一个Button.
向 Form1.cs 添加下列命名空间:
using CrystalDecisions.CrystalReports.Engine;
创建一个报表对象,作为 Form1() 中的公共 ReportDocument 变量:
public ReportDocument oRpt=null;
在函数 button1_Click() 中,使用“报表文档”对象加载 MyReport.rpt,并将该对象绑定到 Windows 窗体查看器:
private void button1_Click(object sender, System.EventArgs e)
{
rpt=new ReportDocument();
rpt.Load("..//..//MyReport.rpt");
crystalReportViewer1.ReportSource=rpt;
}
**使用DataSet创建主从表报表的Demo:
在报表中,有许多表是主从结构,比如:订单与订单细节,每个订单是一个“订单”表中的一条记录,而其细节是另个一 个“订单 细节”表中的多条记录,两个表通过一个字段"订单ID"关联起来,这种报表可利用其分组功能实现,下面对其进行具体的介绍。
在From1.cs上添加“CrystalReportViewer”控件。
在“解决方案资源管理器”中,右击项目,指向“添加”,选择“数据集”,单击确定。
在“服务器资源管理”器中,添加连接,本示例使用"Crystal Report for .NET"中的示例数据库Xtreme.mdb,默认的安装
目录在
“F:Program Files/Microsoft Visual Studio.net/Crystal Reports/Samples/Database/chs”下,单击确定。
将“订单”表和“订单细节”表拖到”DataSet“中。
新建一个Crystal Report文件,起名为"MyReport".
使用报表专家,在”项目数据“中选择”ADO。NET数据集“,插入”订单“和”订单明细“表,在字段选择器上选择要在报表上
显示的数据
字段。有两个字段是必须的({客户.客户ID}和{产品细节.产品ID})。在”组“选项卡中选择分组依据为”订单“表的”订单ID“。
单击”完成“。
回到Form1.cs下进行编码。
在Form1的命名空间的开始地方输入:
using System.Data.OleDb;
在Form1的类定义开始地方输入:
private MyReport report=null;
在Form1_Load()中输入:
report=new MyReport();
Dataset1 dataSet=new Dataset1();
OleDbConnection conn=new OleDbConnection
("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F://Visual Studio.net//Crystal Reports//Samples//Database//chs//Xtreme.mdb");
OleDbDataAdapter oleAdapter=new OleDbDataAdapter("SELECT * FROM 订单",conn);
oleAdapter.Fill(dataSet,"订单");
OleDbDataAdapter oleDetailsAdapter=new OleDbDataAdapter("SELECT * FROM 订单细节",conn);
oleDetailsAdapter.Fill(dataSet,"定单细节");
report.SetDataSource(dataSet);
crystalReportViewer1.ReportSource=report;
产生两个OleDbDataAdapter类的对象,并分别使用填充Fill方法可以连接到被指定的数据库获取数据。
**图表:
Crystal Reports 使您可以在报表中包含复杂的、多彩的图表。绘制图表不仅是一种表示数据的方法,也是一种分析工具。
用户可以在图表或图表的图例上深化以获取详细信息。
可以根据以下内容绘制图表:
摘要和小计字段
详细信息、公式和运行总和字段
交叉表摘要
**如何在报表中插入图表的具体步骤:
在 Report Designer 中右击,指向“插入”,并单击“图表”。
在“类型”选项卡中,选择图表类型。
如果希望“图表专家”使用“坐标轴”和“选项”选项卡上的默认选项,请选择“自动设置图表选项”。
单击“数据”选项卡。
在“位置”区域,指定图表在报表中出现的频率,然后单击“页眉”或“页脚”指定放置图表的位置。
在“布局”区域,选择图表布局。
在“数据”区域,指定要作为条件使用的数据库字段。
如果“坐标轴”和“选项”选项卡出现,则可以自定义某些图表属性,如轴的缩放比例、图例和数据点。
单击“文本”选项卡。接受默认标题信息或将新标题添加到图表。
单击“确定”按钮。
**使用公式
公式概述:
在许多情况下,报表所需的数据以存在与数据库表字段中。例如:若要准备一份订单列表,应将适当的字段放置在表内。
但是,有时需要在报表中放置不存在与任何数据字段中的数据。在这种情况下,便需要创建公式。例如:若要计算处理每
份订单所需花费的天数,则需要一个可确定的订购日期和发货日期之间天数的公式。利用Crystal Report可以轻松地创建
此类公式。
使用“公式编辑器”创建和编辑公式。
当通过右击“字段资源管理器”中的“公式字段”并选择“新建”来编辑现有的公式字段或创建新的公式字段时,
出现该对话框。在为公式命名之后即会出现该对话框。
**子报表:
子报表是报表中的报表。使用子报表,可以幌喙氐谋ū砗喜⒌揭桓霰ū碇小?梢孕鞅疚薹唇拥氖荩蛘咴诘ジ?BR> 报表中显示相同数据的不同视图。
创建子报表的过程与创建常规报表的过程相似。字报表有报表大多数的特性,包括他自己的记录选择条件。子报表月报表之间
唯一的区别是子报表:
* 是作为对象插入到主报表中,它不能独立存在(但可以将子报表另存为主报表)。
* 可以放置在报表的任何一节内,整个子报表将在该节中打印。
* 子报表中不能包含另一个子报表。
**如何创建子报表的具体步骤:
在 Report Designer 中右击,指向“插入”,单击“子报表”。
将子报表对象拖动到报表上。
选择项目中的一个报表、另一个现有报表或为子报表创建一个新报表。
选择“按需要显示子报表”以便能够在需要时检索子报表上的数据。否则,所有子报表数据将与报表一起出现。
注意 使用按需要显示子报表将提高包含子报表的报表的性能。
如果需要将子报表链接到主报表中的数据上,请单击“链接”选项卡。
从“可用字段”列表中选择要在主(包含)报表中用作链接字段的字段。
使用“字段链接”部分(只有在选定了链接字段后才会出现)为每个链接字段设置链接:
从“使用的子报表参数字段”中选择要链接到主报表的字段;
选择“基于字段选择数据”复选框,并从相邻的下拉列表中选择字段,以便基于特定的字段组织子报表数据(这相当于快速使用“选择专家”
)。如果没有在这里指定字段,子报表将采用主报表的结构。
单击“确定”按钮。