C#打印水晶报表
大家平时做一个项目的时候,总有需要做打印这个模块的,既然有需要那现在就教大家如何做水晶报表。
第一、安装插件。这是一个需要借助下图插件才能完成的报表,如果不知道安装是否成功的,可以先进行第二步操作。
第二、建存放打印相关的文件夹。建与控制器文件夹并列就好。建好后可以按右键选择新建项对插件进行检验是否安装成功。新建项中有Reporting这个项,如果没有这个项就是失败,但有的话选择它可以看到下图中的Crystal Reports就是安装成功了
第三、新建数据集。这个数据集就建在刚刚建的文件夹中,直接选中这个文件夹按右键选择新建项,然后选择数据打开,选择数据集更改名称完成。这时候就进入了一个空的数据集中了。这时候有两种方法可以添加表。
一、直接右键选择DataTable1新建一个空白表,点击表头位置可以更改表的名称,在表头的下方空白处右键可以添加列,这个列就是打印内容在数据库表上的字段,你要打印什么内容,这些内容是什么字段名,就在这里加上什么名的列。这里的列的数据类型全部默认为string,所以每加一个列都需要检查数据类型。直接选中列右键选属性就可以更改数据类型了。
二、选择TableAdapter连接数据库,到了选择命令类型的时候一定要选择使用SQL语句,接着就是输入SQL语句了,语句这里可以去数据库里查询,把打印需要用到的字段查询出来再复制到输入框里就会像下图一样。现在可以对查询出来的的字段进行检查是否完整,防止出错要重建。确定以后点完成。表就这么出来了。再对表的字段进行检查。再对它的名称修改一下。这就保存一下完成了。
第四、建打印的模板。在第一步建好的文件夹中右键添加新建项,选择Reporting打开。再点击里面的Crystal Reports修改名称接着确认,如果名称不需要更改则可以直接双击打开,现在来到了创建文档这一步,我们选择空白的报表,其他的报表不一定适合我们的要求。至于空白的报表打开后的页面是像下图这样的。
第五、设计打印样式。我们先来准备好画表需要的东西,先是找到新建的全是打印字段的表,就是选中上图中的数据库字段右键选择数据库专家,它会打开一个简单的页面供你找到这个字段表。很简单就是你要在下图的左边的可用数据源中找到建好的字段表。双击或者选中然后点图中的》,然后按图中提示内容操作,完成后确定就可以了。具体看下图中的内容。
以上的基础步骤做完后,真正的打印模板才刚刚开始。这个时候左边的数据库字段下面就有了一张表存在。这张表是我们自己做的表,里面全是要打印的字段。我们要用到的东西也不多,就只有左边的字段和特殊字段、文本对象、线和框这么多个。我们要了解一下报表的五个部分,分别都有什么作用或者说是该添加什么的。还有右键的设计中可以调整大小、边距什么的。里面的表头当然就是放标题的了,添加文本对象写上标题,然后在表头的右下角添加上特殊字段时间与日期,放置这两个特殊字段前要先用文本对象把时间日期这些字写出来,特殊字段是不包括文字的。再到页脚添加上特殊字段页码。
小事情都搞定了,接着就是内容部分了,内容就是我们左边的字段了。按顺序把字段拉到详细资料这一行来,是拉出来而不是添加文本对象自己打上去,还有一定要确保是拉到了详细资料那行灰色的行上面才能放手。拉正确的话字段会自动一分为二,而且左边的字段处会打上一个√。分到页眉行的字段点击选中它把字段名称改成中文的意思。分到详细资料的行千万别再动了。接着就差划表格了。画表格什么的就自己添加框和线发挥吧。画好自己点右下角主报表预览,觉得不好看就自己慢慢修改吧。紧接着就是代码部分了,代码就比较少,就用一下报表的模板。
数据查询已省略,以下为使用报表的代码
DataTable dt = LINQToDataTable(listAchiement); LINQToDataTable下面有介绍
将listResult转化为DATATable类型 listAchiement为查询出来的数据
ReportDB myDB = new ReportDB();实例化数据集
myDB.Tables[“tbAchievement”].Merge(dt); 将dt的数据放入数据集的数据表中
AchievementReport rp = new AchievementReport();接着实例化报表模板
string strRptPath = System.Web.HttpContext.Current.Server.MapPath("~/") +
“Areas\ExaminationManagement\PrintReport\AchievementReport.rpt”;
获取报表的物理文件地址,按实际的来就好
rp.Load(strRptPath); 把报表文件加载到Report Document
rp.SetDataSource(myDB); 设置报表的数据来源
Stream stream = rp.ExportToStream(CrystalDecisions.Shared.
ExportFormatType.PortableDocFormat); 把ReportDocument转化为文件流
return File(stream,“application/pdf”); 返回流
下面是关于数据类型的转化
public DataTable LINQToDataTable(IEnumerable varlist)
{ DataTable dtReturn = new DataTable(); 定义要返回的DataTable对象
PropertyInfo[] oProps = null; 保存列集合的属性信息数组
if (varlist == null) return dtReturn; 进行安全性检查
foreach (T rec in varlist) 循环遍历集合,使用反射获取类型的属性信息
{ 使用反射获取T类型的属性信息,返回一个PropertyInfo类型的集合
if (oProps == null)
{ oProps = ((Type)rec.GetType()).GetProperties();
foreach (PropertyInfo pi in oProps) 循环PropertyInfo数组
{ Type colType = pi.PropertyType; 得到属性的类型
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
== typeof(Nullable<>))) 如果属性为泛型类型
{ colType = colType.GetGenericArguments()[0];
} 获取泛型类型的参数
将类型的属性名称与属性类型作为DataTable的列数据
dtReturn.Columns.Add(new DataColumn(pi.Name, colType)); }}
DataRow dr = dtReturn.NewRow();
新建一个用于添加到DataTable中的DataRow对象
foreach (PropertyInfo pi in oProps) 循环遍历属性集合
{ 为DataRow中的指定列赋值
dr[pi.Name] = pi.GetValue(rec, null) == null ?
DBNull.Value : pi.GetValue(rec, null);}
dtReturn.Rows.Add(dr); 将具有结果值的DataRow添加到DataTable集合中
}
return dtReturn; } 返回DataTable对象
用水晶报表的代码就这么多,如果觉得不适合自己的可以自己建一个,或者换一种方法,这次的打印水晶报表就到这结束了。