水晶报表
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:Visual Studio 2015
作者:李成富
撰写时间:2019年6月20日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一、创建数据集
二、创建(调用)水晶报表
三、WPF打印不可以直接打印出水晶报表,需要借用XAML的一个窗口,然后通过引用进来的插件把水晶报表插入到XAML页面上,然后添加引用xmlns:view="clr-namespace:SAPBusinessObjects.WPF.Viewer;assembly=SAPBusinessObjects.WPF.Viewer"。
最后加入控件:<view:CrystalReportsViewer x:Name="CRV_Staff" Height="680" Width="950" />,这个控件可以直接装载水晶报表。XAML布局完后,就可以到C#编程了。
C#编程:
- 首先引用方法,把涉及到的基本数据先传递过来,引用服务端
//1.0 实例化命名空间
BLL.SystemInformation.UC_Staff.UC_StaffClient myClient = new BLL.SystemInformation.UC_Staff.UC_StaffClient();
- 接下来就要把水晶报表加载进来,要实现水晶报表打印的话,页面显示的内容在水晶报表里面,但是传递的数据在数据集里面,而要合并的话是在XAML里面,所以要把这是三个关联起来。所以有三个步骤:获取数据、合并数据集(给数据集表格赋值)和绑定窗口控件。在步骤获取数据中,要获取页面传递过来的数据、读取图片(如果有图片的话),还有创建临时表格数据
private void Window_Loaded(object sender, RoutedEventArgs e)
{
#region 1、获取数据
#region (1)、获取页面传递过来的数据
//获取传递过来的员工ID
int staff_id = Convert.ToInt32(drvstaff.Row["staff_id"]);
//创建临时数据表格dt1保存基本数据
DataTable dt1 = myClient.btn_Print_Staff(staff_id).Tables[0];
//提取图片名称
string strpicture = dt1.Rows[0]["picture"].ToString().Trim();
#endregion
#region (2)、读取图片
try
{
//获取图片路径
strload = myClient.btn_Select_UC_StaffPhoro(strpicture);
//IO流读取图片
FileStream filstream = new FileStream(strload, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
//IO流转换为byte[]
bytes = new byte[filstream.Length];
//从流中读取字节块并将该数据写入给定缓冲区中。
filstream.Read(bytes, 0, bytes.Length);
}
catch (Exception)
{
throw;
}
#endregion
#region (3)、创建临时表格数据
//实例化数据表
DataTable dt = new DataTable();
//给数据表创建对象
dt.Columns.Add("picture", typeof(byte[]));
//新建行
DataRow myDataRow = dt.NewRow();
//给单元格赋值:把读取的图片添加到数据行里面
myDataRow["picture"] = bytes;
//给数据表添加行数据(获取图片)
dt.Rows.Add(myDataRow);
#endregion
#endregion
#region 2、合并数据集(给数据集表格赋值)
//实例化数据集
TrainDS myTrain = new TrainDS();
//把数据集和表格合并(给数据集绑定数据)
myTrain.Tables["t_staff"].Merge(dt1);
myTrain.Tables["t_picture"].Merge(dt);
#endregion
#region 3、绑定窗口控件
//实例化水晶报表
CRY_Staff myCRY_Staff = new CRY_Staff();
//给水晶报表设置数据集
myCRY_Staff.SetDataSource(myTrain);
//打开第三方控件(绑定数据)
CRV_Staff.ViewerCore.ReportSource = myCRY_Staff;
#endregion
}
需要用到的引用有以下几个:
- CrystalDecisions.CrystalReports.Engine
- CrystalDecisions.ReportSource
- CrystalDecisions.Shared
- SAPBusinessObjects.WPF.Viewer
- SAPBusinessObjects.WPF.ViewerShared
前面三个是引用程序集里面的,后面两个是安装水晶报表路径下的,一般路径为C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet\SAPBusinessObjects.WPF.ViewerShared.dll
要在App.config里的Startup下加 useLegacyV2RuntimeActivationPolicy="true",不然会报错
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
效果图如图所示: