浅谈水晶报表在ASP.NET中的一种灵活应用
使用水晶报表的强大功能来实现应用程序的统计分析及打印导出等功能,是微软平台上进行.NET应用程序开发报表的一种不错的选择。水晶报表在设计、开发、配置以及部署上,还是会给初学者带来一定的困扰的。那么,是否存在一种相对比较简单而且易用的方式来进行水晶报表的设计、开发、配置以及部署呢?本文将提供一种比较简单且相对灵活的方法。
本文将包含以下内容:
- Crystal Reports的另类非对象模式数据绑定
- 水晶报表的简单模式部署
P.S. 本文中描述到的Crystal Reports为Crystal Reports for Visual Studio .NET,原则上该版本是runtime free授权,for unlimited user的。VS IDE版本为2008,Crystal Reports版本为10
- Crystal Reports的另类非对象模式数据绑定
水晶报表绑定数据的模式有很多种,其中包括使用DataSet、DataReader及ObjectCollection等。在某个特定的系统项目中,我们多数通过指定的业务数据库来提供对报表数据的支持。本文将主要描述一种非数据库数据绑定的变通模式,通过这种模式进行绑定的报表,可以不用设置其数据库验证参数(DBLogon)的相关信息,具体的数据源可以来源于数据库,也可以来源于xml文件等其他半结构化数据。
- 在VS IDE项目的Solution Explorer中,建立存放报表文件的文件夹,如ReprotFilesFolder
- 用鼠标右键点击新建的文件夹,选择添加新项(Add New Item...)
- 选择“XML Schema”,将文件命名为Demo.xsd
- 用DataSet Editor打开该Schema文件,点击“Ctrl+Alt+S”,打开“Server Explorer”,找到当前项目使用的数据库连接,将报表展示涉及到的数据表拖拽到设计区域
- 推拽的表可以是存在键值关系的表,也可以是毫无关系的表,甚至通过存储过程建立的临时表,保存该xsd文件
- 用鼠标右键点击新建的文件夹,选择添加新项(Add New Item...)
- 选择Crystal Report,将报表文件命名为Demo.rpt,点击添加(Add)
- 在打开的水晶报表向导窗口中选择“使用报表向导”,点击确定
- 在报表向导的数据向导页中,选择“创建新连接-数据库文件”
- 点击数据库文件前的“+”,将弹出选择数据文件窗口,找到刚才创建的Demo.xsd文件,并点击“打开”
- 此时,我们刚添加到Demo.xsd中的两个数据表将出现在“数据文件”节点的子节点下,选中数据表,点击“>”按钮,将表添加到“已选择表”列表中
- 点击“下一步”,可以为表之间添加隐式的键值关系
- 点击完成,将生成一张空白的报表
- 根据实际的业务情况设计符合要求的报表,并保存报表文件,例如下图
- 设计工作到此告一段落,下面将进行数据的绑定。
- 新建一个WebForm页面,将CrystalReportViewer添加到页面中,如下图所示
- 在后台页面中首先引用Crystal Reports的程序集
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
- 定义变量
private ReportDocument reportDocument;
- 添加自定义方法
/// <summary>
/// 初始化报表
/// </summary>
private void ConfigureCrystalReports()
{
//当前业务的报表打印文件
string RPTFile = "";
//当前业务的报表打印数据集
DataSet ds = null;
#region 获取报表打印文件
if (Session["rf"] == null)
{
RPTFile = Server.MapPath("Demo.rpt");
Session["rf"] = RPTFile;
}
else
RPTFile = Session["rf"].ToString();
#endregion
#region 获取当前业务的报表打印数据
if (Session["pd"] == null)
{
ds = new DataSet();
string sql = "";
sql = "select * from SalesMaster where BItemSerialNumber='0802280001'";
DataSet masterDs = 填充主表数据
//将主表添加到报表数据集中
ds.Merge(masterDs);
//利用同样的方法添加子表或其他的表,甚至可以添加表和表之间的关系
//上述方法也可以从其他数据源读入数据,包括Access数据库、xml数据等
Session["pd"] = ds;
}
else
ds = (DataSet)Session["pd"];
#endregion
if (Session["reportDocument"] == null)
{
reportDocument = new ReportDocument();
reportDocument.Load(RPTFile);
reportDocument.SetDataSource(ds);
Session["reportDocument"] = reportDocument;
}
else
reportDocument = (ReportDocument)Session["reportDocument"];
ReportViewer.ReportSource = reportDocument;
}
- 在页面的Page_Load方法中添加Response.Expires = -1;
- 添加页面初始化方法
/// <summary>
/// 页面初始化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Init(object sender, EventArgs e)
{
ConfigureCrystalReports();
}
- 至此,报表的数据绑定及显示工作完成。编译项目后,在浏览器中可以查看报表效果。此种方法的灵活性在于
- 完成后,完全可以删除.xsd的Schema文件而运行,或将.xsd文件移出项目。
- 数据的读入,不论来自SQL Server、Access还
- 完成后,完全可以删除.xsd的Schema文件而运行,或将.xsd文件移出项目。
- 在VS IDE项目的Solution Explorer中,建立存放报表文件的文件夹,如ReprotFilesFolder