设计和集成 Crystal Reports






2.36/5 (9投票s)
2007年8月8日
5分钟阅读

63752

1116
为您的应用程序提供专业外观的报表。
引言
我最近为一个项目开发了一个报告模块,其中所有报告都需要转换为 Crystal Reports。我使用了各种推送/拉取模型并进行了一些研究。我遇到的问题是,我想摆脱 Crystal Reports 对数据库的独占依赖,即“如果应用程序可以访问数据库,那么 Crystal Reports 也应该可以”。我发现的最好方法是通过数据集架构。有多种方法可以做到这一点,我将介绍一种简单的、你可以用来做这件事的方法。
我将采用一种循序渐进的方法,这对我自己来说更容易理解,而不是零散的片段。
将 Crystal Report 包含到你的项目中
要将 Crystal Report 包含到你的项目中,请右键单击项目并选择“添加新项”,然后选择“Crystal Report”。将 Crystal Report 命名为你想要的任何名称,例如“Accounts Detail Report”。为了简单起见,在此示例应用程序中我将其命名为“Report1”。过程如下面的图像所示。
从弹出的对话框中选择 Crystal Report,如下面的图所示
添加报告后,它会立即询问你要在项目中添加哪种类型的报告。对于此方法,请选择“空白报告”,如下面的图所示
现在报告已包含在你的项目中,并且“解决方案资源管理器”会在项目文件中显示它。在后台,Visual Studio 会生成一个与报告同名的类,但我们不必担心它。
设计报告
要设计报告,Crystal Report 需要知道要显示什么数据。因此,我们需要指定将作为输入提供给报告的数据。通常,当我们谈论报告时,通常会有一个数据网格或某种格式的现有报告,其输入为数据集。使用数据集,我们可以通过简单地调用“WriteXMLSchema”来获取数据架构。这只需要一次来设计报告,之后可以将其注释掉或从代码中删除,或者作为替代方案,可以添加并配置 xsd。我包含的示例应用程序从名为 Books 的数据库获取数据集,执行查询以获取数据并将其填充到数据集中。然后我调用“WriteXMLSchema”方法来获取数据集的架构。
try
{
// getting the dataset
string connString = System.Configuration.ConfigurationSettings.AppSettings.Get("ConnectionString");
string query = "Select * from book";
conn = new OleDbConnection(connString);
conn.Open();
da = new OleDbDataAdapter(query, conn);
ds = new DataSet();
da.Fill(ds);
// writing schema of dataset to a file
// This should be commented once the report is designed
//ds.WriteXmlSchema(@"C:\reportSchema.xml");
// Crystal report code here
Report1 rpt1 = new Report1();
rpt1.SetDataSource(ds);
crystalReportViewer1.ReportSource = rpt1;
}
catch (Exception ex)
{
MessageBox.Show("Error in report" + ex.Message);
}
finally
{
conn.Close();
}
一旦有了架构,只需注释掉“WriteXMLSchema”,然后双击解决方案资源管理器中的报告。现在我们需要向 Crystal Report 指定我们将要传递给它的数据集。如下面的图所示
为此,右键单击“字段资源管理器”中最顶层的字段“数据库专家”。在弹出的菜单中,展开“创建新连接”,然后展开“ADO.NET”。将弹出一个对话框,要求输入文件路径,只需浏览到使用 WriteXMLSchema 保存 XML 架构的文件,类似于下面的图所示
数据库专家会读取数据集架构,并在可用表列表中显示一个数据集。
选择“表”,将其添加到选定的表中,然后点击“确定”。数据库专家现在显示了数据集中包含的所有字段。只需将你想在报告中显示的字段拖到“详细信息”部分以用于重复记录,Crystal Reports 会自动生成标题。你可以通过右键单击并选择“格式化对象”来重命名或修改它。
完成报告设计,并添加任何其他特殊字段,方法是右键单击报告并选择“添加特殊字段”,用于打印日期、时间、页码、页眉、页脚等字段。完成后,关闭报告并保存更改。
将数据传递给 Crystal Report
要在窗体上显示 Crystal Report,你应该有一个 Crystal Report Viewer 控件,它在工具箱的 Crystal Reports 部分下可用。如果你将其拖到窗体上,它将包含运行 Crystal Report 所需的所有引用。因此,只需拖放一个 Crystal Report Viewer 控件并设置属性。我们用于生成 XML 的数据集现在应该传递给此报告。这可以通过实例化 Crystal Report 对象(Visual Studio 为你生成的与报告同名的类)并传递数据集来完成,然后设置报告源属性,如下面的代码片段所示
Report1 rpt1 = new Report1();
rpt1.SetDataSource(ds);
crystalReportViewer1.ReportSource = rpt1;
使用示例代码和测试应用程序
我包含的数据库脚本、完整的代码和解决方案文件可用于在 SQL Server 2005 或 2000 上运行以创建数据库。你可以在 app.config 中配置连接字符串,以适应你的设置和数据库信息。
摘要
这种方法有好有坏。好的地方在于它非常容易快速开发设计,并且与数据集结合使用可以实现清晰的实现,因此你可以真正专注于架构和组件的工作。最大的问题在于当报告需要更改并且你必须包含更多字段时,这会花费更长的时间,因为你必须将其添加到你的数据集中,然后重新设计报告,而不是仅仅添加一个字段。如果你有其他方法可以做到,我很乐意倾听你的意见,请给我反馈,或者在遇到任何问题时随时提出讨论。