Crystal Report制作使用
本文主要划分为以下六部分:
一、Crystal Report for .NET 的功能
二、Crystal Report总体结构
三、报表数据访问执行模式
四、报表类型
五、Crystal Report 设计器的布局
六、Crystal Report 的具体实例
最近项目接近尾声,应要求总结了一下,为了对在.net环境下开发报表的程序员新手一些帮助,同时也为给新人培训做一次文档准备。
相信在大部分的应用程序中报表都是程序员头疼的问题。但是在.net环境下包含了功能强大的报表工具: Crystal Report。它能很好的与数据库交互,做出各种漂亮的报表和分析图表.它能良好地替开发人员排忧解难。如下图:
从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 的报表处理功能整和到自己的数据库应用程序中,Windows应用程序和Web开发人员可以节省开发时间来满足用户的需求。Crystal Report 支持大多数流行的开发语言,可以方便的在任何应用程序中添加报表。
具体来说,Crystal Report的功能有以下几点:
1、全面的数据库访问:
Crystal Report 中包括了超过35中数据源驱动,可以访问一种XML、企业和关系型数据库。
2、广泛的设计格式与设计:
通过Crystal Report,用户可以将数据库转换为高度交互性内容。可以从100多中格式选项中进行选择、包括参数、映射、交叉表和超级链接、用以强化报表的冲击力。
3、强大的图表设计功能:
Crystal Report 可以在报表中包含多彩的、易读的图表(提供了非常丰富的报表类型,如:条形图、折线图、面积图、饼图、甘特图、股票图等)。
4、灵活的应用集成技术:
Crystal Report 带有灵活的Java、COM和.NET SDK,以及可内嵌的Report Application Server,可将报表与企业Web应用紧密地集成在一起。通过使用Crystal Report 的"零"客户端浏览器控制,能够为最终端拥护提供丰富的报表交互、创建和修改功能。
5、强大的报表导出:
Crystal Reprort 的所有的报表都可以导出多种不同的格式:包括XML、PDF、HTML、和Microsoft Excel。
二、Crystal Report总体结构
展示报表具有两层结构的Crystal Report需要:
界面:
界面仅需使用Winform窗体或者Web程序中使用浏览器。
后台:
1、Crystal Report Engine (CREngine.dll)
将数据与报表文件合并、将数据输出为不同的格式,将Crystal Report转为传到.aspx页中的简洁明了的HTML.
2、Crystal Report Designer (CRDesigner.dll)
使用Crystal Report Designer可以制作报表,可以设计标题、插入数据、公式、表格、次级报告等。
3、The .rpt Report file
将一份报表应用到你的应用程序中的第一步是使用Crystal Report Designer创建报表。但是如果已经有了一些现成的样本,你现在就可以用它。
4、The Data Source
.rpt文件获取数据的方式取决于你所选用的方法。你可以选择制作Crystal Report以获取数据而无须手工写任何代码,也可以选择绑定你的dataset并将其传入报表文件。
5、Crystal Report Viewer
Crystal Report Viewer是一个能够插入页中的容器(.net中习惯称为控件)。
三、报表数据访问执行模式
1、拉模型 Pull Model
在拉模型中,驱动程序将连接到数据库并根据需要将数据“拉”进来。使用这种模型时,与数据库的连接和为了获取数据而执行的 SQL 命令都同时由 Crystal Reports 本身处理,不需要开发人员编写代码。如果在运行时无须编写任何特殊代码,则使用拉模型。
2、推模型 Push Model
相反,推模型需要开发人员编写代码以连接到数据库,执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中,并在 Crystal Reports 收到数据之前先将数据筛选出来。
四、报表类型
Crystal Report Designer可以是独立于解决方案的报表外,也可是装载包含于解决方案方案之中的报表。
1、Strongly-typed Report :
当在方案中加入一个报表时,该报表就成为一个Strongly-typed Report。在这种情况下,你可以直接创建报表实例(可以减少若干代码),可以将其隐藏。当然你可以点击Solution Explorer中的”show all files”来显示它。
2、Un-Typed Report :
不包含在方案中的报表即Un-Typed Report。在这种情况下,必须创建一个Crystal Report Engine的''Report Document''对象并将报表手工装载进去。
五、Crystal Report 设计器的布局
首先,在Visual Studio.NET 的一个工程中添加一个向 Windows 或 Web 窗体发布数据的 Crystal 报表文件:
添加成功之后,打开该报表:
从上图可以看到设计器的完整布局。
1、字段资源管理器:
列出该报表所有的字段,如:使用的数据库字段、参数字段、公式字段等。可以在此修改和删除字段对象。
2、主报表窗口:
用来在报表窗口中显示主报表。对于包含子报表的报表,有主报表窗口和对每个的深化(通过双击)的子报表有一个
子报表窗口。可以通过右击报表窗口的任何空白位置来启动报表快捷菜单。
3、水晶报表主工具栏:
包括记录选择、分类和文本对象格式化图标。可以对整个工具栏移动或改变大小。
4、水晶报表插入工具栏:
可以插入汇总字段、组、子报表、图表和图片的图标。也可以在Crystal Report工具栏中单击鼠标来选择"插入"。
六、Crystal Report 的具体实例
本部分的例子分成两部分:Windows应用程序中的Crystal Report开发;Web应用程序中的Crystal Report开发应用。并且在两种环境下分别介绍拉模型与推模型的例子。
在本部分例子中使用的软件环境:Microsoft Visual Studio 2005;Microsoft SQL Server 2005。数据例子如下:服务器:cotton-b数据库名:lhcy数据库表:ProjectStage
数据表结构:
数据:
主要功能为统计项目阶段工时数。
1、 如何设计报表文件模版。
1) 增加一个结果集 DataSet1.xsd,并增加表
2) 首先在增加一个报表文件 rpt文件
3) 使用报表专家,在"项目数据"中选择"ADO。NET数据集",插入"ProjectStage"表,在字段选择器上选择要在报表上
4) 选择要分组的字段依据
5) 选择展示的图表和显示的主题信息
最终生成的结果如下。
2、Windows应用程序中的Crystal Report开发
2.1 拉模型 pull model 的demo
在拉模式中如要在水晶报表中的SQL语句加上条件参数时要用{?参数名}方式给出。
例:“SELECT ProjectID, Manhours FROM ProjectStage Where ProjectID ={?parm}” parm就是参数名.
private void Form1_Load(object sender, EventArgs e)
{
ReportDocument rpt=new ReportDocument();
rpt.Load(Application.StartupPath + "CrystalReport.rpt");
//SetDatabaseLogon 拉模式中必须用这个方法来设置登录信息,参数一:用户//名;参数二:密码;参数三:服务器;参数四:数据库名
rpt.SetDatabaseLogon("sa","123456", "cotton-b", "lhcy");
// 给水晶报表传参数,参数一:是参数名,参数二:参数值;
rpt.SetParameterValue("Parm", 1);
rpt.SetParameterValue("Title", "拉模型demo");
// CrystalReportViewer1是水晶报表浏览器,下面是给该浏览器赋上对像
crystalReportViewer1.ReportSource = rpt;
}
2.2推模型 push model的demo
在推模式中编程组装的Dataset里的SQL语句中的字段要与水晶报表里的SQL语句字段一致。简单的说,推模式中的水晶报表是个模板,把在设计器里报表的格式设好后,再组装DataSet就可以生成报表了。
private void Form1_Load(object sender, EventArgs e)
{
CrystalReport1 report = new CrystalReport1();
string sDBConnetction = "Data Source=cotton-b;Initial Catalog=lhcy;Persist Security Info=True;User ID=sa;Password=123456";
DataSet1 ds = new DataSet1();
SqlConnection conn = new SqlConnection(sDBConnetction);
SqlDataAdapter adapterProjectStage = new SqlDataAdapter
("select * from ProjectStage where ProjectID=2", conn);
adapterProjectStage.Fill(ds, "ProjectStage");
report.SetDataSource(ds);
report.SetParameterValue("Title", "推模型demo");
crystalReportViewer1.ReportSource = report;
}
3、Web应用程序中的Crystal Report开发
3.1 拉模型 pull model 的demo
与Winform应用程序的拉模型一样,要在水晶报表中的SQL语句加上条件参数时要用{?参数名}方式给出。
例:“SELECT ProjectID, Manhours FROM ProjectStage Where ProjectID ={?parm}” parm就是参数名.
protected void Test_pullmodel (object sender, EventArgs e)
{
// CrystalReport.rpt是水晶报表文件的名称;CrystalReportSource1是从工具箱加到页面上的水晶报表数据源对像。
CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));
// SetDatabaseLogon 拉模式中必须用这个方法来设置登录信息,参数一:用户名;参数二:密码;参数三:服务器;参数四:数据库名
CrystalReportSource1.ReportDocument.SetDatabaseLogon("sa","123456", "cotton-b", "lhcy");
//给水晶报表传参数,参数一:是参数名,参数二:参数值;
//CrystalReportSource1.ReportDocument.SetParameterValue("Title", "拉模型的demo");
CrystalReportSource1.ReportDocument.SetParameterValue("Parm", 1);
//绑定水晶报表数据源。
CrystalReportSource1.DataBind();
// CrystalReportViewer1是水晶报表浏览器,下面是给该浏览器赋上对像
CrystalReportViewer1.ReportSource = CrystalReportSource1;
CrystalReportViewer1.DataBind();
}
3.2推模型 push model的demo
string sDBConnetction = "Data Source=cotton-b;Initial Catalog=lhcy;Persist Security Info=True;User ID=sa;Password=123456";
DataSet1 ds = new DataSet1();
SqlConnection conn = new SqlConnection(sDBConnetction);
SqlDataAdapter adapterProjectStage = new SqlDataAdapter("select * from ProjectStage where ProjectID=2", conn);
adapterProjectStage.Fill(ds, "ProjectStage");
CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));
CrystalReportSource1.ReportDocument.SetDataSource(ds.Tables["ProjectStage"]);
CrystalReportSource1.DataBind();
CrystalReportViewer1.ReportSource = CrystalReportSource1;
CrystalReportViewer1.DataBind();