WPF之水晶报表打印
WPF是框架是是窗体应用程序,其中水晶报表也是我们比较常用的技术,一些公司的业务处理离不开打印报表,WPF水晶报表打印需要引用插件,大家都知道WPF的页面搭建是通过XAML来编辑的,所以制作水晶报表跟MVC还是有较大的区别的,下面给大家展示一个WPF打印水晶报表的实例:
1、 首先要把水晶报表的插件放在当前项目的bin/Debug下面然后在项目中引用(网上可以下载)
接着就是要安装一个设计报表的 插件CRforVS_13_0_14,安装完成就可以创建水晶报表了;创建好的数据集可以往里面添加表,给数据集表添加数据的方法有很多,这里就是通过添加TableAdapter表再通过字符串形式连接数据库,然后通过sql语句访问数句库,下一步就是输入Sql查询语句,就可以完成数据集的操作了
创建数据集
往数据集添加表,并输入SQL语句
因为是根据SQL语句查询数据库生成的表,字段的类型和数据库一致,所以不必改字段类型,接下来就是创建水晶报表
创建完水晶报表后就把数据集添加到数据库专家里;然后就根据需要编辑设计报表,把刚创建的数据集添加到水晶报表的数据库专家,再把字段拖放到相应的位置。
报表布局
做完准备工作之后,就去搭承载打印的页面,代码如下:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Viewer="clr-namespace:SAPBusinessObjects.WPF.Viewer;assembly=SAPBusinessObjects.WPF.Viewer"
x:Class="项目界面搭建.SystemInformation.ReportForms.WD_staff"
mc:Ignorable="d"
Title="WD_Staff" Height="680" Width="950" Loaded="Window_Loaded" WindowStartupLocation="CenterScreen">
<Grid>
<Viewer:CrystalReportsViewer Height="680" Width="950" x:Name="CRV_Staff"/>
</Grid>
</Window>
其中Viewer就是引用的插件,把水晶报表用 Viewer: CrystalReportsViewer 承载,写完页面的代码就写页面后台代码(页面加载是完成执行),后台就是处理数据,代码如下:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
#region 1、提取数据
#region 1、获取页面传递过来的数据
int staff_id = Convert.ToInt32(drv.Row["staff_id"]);//获取页面传过来的数据(ID)
//创建临时数据表格dt1保存基本数据
DataTable dt1 = myUC_StaffInformationClient.Window_Loaded_SelectstaffGongZuoZheng(staff_id).Tables[0];
//2、文件夹头像信息
string strpicture = dt1.Rows[0]["picture"].ToString();//提取图片名字
#endregion
#region 2、读取图片
//获取图片路径
strload = myUC_StaffInformationClient.UserControl_Loaded_SelectPhoro(strpicture);
//IO流读取图片
FileStream filstream = new FileStream(strload, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
//IO流转换为byte[]
bytes = new byte[filstream.Length];
//从流中读取字节块并将该数据写入给定缓冲区中。
filstream.Read(bytes, 0, bytes.Length);
//创建临时表临时保存图片
#region 3、创建临时表格数据
DataTable dt = new DataTable();//实例化数据表
DataRow myDataRow = dt.NewRow();//新建行
dt.Columns.Add("picture", typeof(byte[]));//给数据表创建对象
//给单元格赋值
myDataRow["picture"] = bytes;//把读取的图片添加到数据行里面
dt.Rows.Add(myDataRow);//给数据表添加行数据(获取图片)
#endregion
#endregion
#endregion
#region 2、合并数据集
//实例化数据集
TTS myTTS = new TTS();
//把数据集和表格合并(给数据集绑定数据)
myTTS.Tables["t_staff"].Merge(dt1);
myTTS.Tables["picture"].Merge(dt);
#endregion
#region 3、实例化页面控件添加数据源
//实例化水晶报表
CRP_Staff myCRP_Staff = new CRP_Staff();
//给水晶报表设置数据源
myCRP_Staff.SetDataSource(myTTS);
//打开第三方控件(绑定数据)
CRV_Staff.ViewerCore.ReportSource = myCRP_Staff;
#endregion
};
页面结果如图所示:
以上叙述虽不够详细,但基本思路就是这样了。