打印报表
在软件系统中不仅仅表格数据的显示,有时候还会用到打印报表功能,把数据打印在纸上,当我们学打印水晶表时候,不知大家有没疑没问呢?水晶报表是什么?主要有什么用处?
在课堂上看到仅仅就是一个表而跟普通的没什么两样(如下图)
但是我觉得还是很好奇,课后回到宿舍还是有点想不懂,于是借助网上的力量查了一下,
解析是这样子的:原名Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表。水晶报表是业内最专业、功能最强的报表系统,它除了强大的报表功能外。最大的优势是实现了与绝大多数流行开发工具的集成和接口。在VS.Net平台做过报表开发的程序员,一定都对水晶报表强大、高效、集成等特性留下了深刻印象。 除了开发新程序外,在工作中我们常需要接触到很多较早的软件系统报表功能升级的需求,如果能结合水晶报表这一强大的工具,往往能事半功倍,经过自己思考,在去寻找想要的答案,到解开心中的疑惑感觉挺愉快的
- 做打印水晶报表之前我们要安装好水晶报表安装包,安装好后在VS直接可以使用了,水晶报表安装也很简单,点击setup.exe运行后下一步下一步直到安装完成就OK了
- 点击打印表格显示出来就有表格的样式,如1图中的表格样式,是怎么做到的呢?是要我们画出来的,那么是怎么画出来的呢?
首先在那个域里面要建一个文件夹,文件夹里面有两个文件
第一个是设计数据源,表格的字段,也相当于设计了一个表格吧,这些字段数据类型要和数据库类型一样(注意:这一步较重要)
第二个是水晶报表模板,把这个模板画出来,打印的时候就按照这个格式打印显示出来
- 开始对原始的画板进行描画,画成我们想要的模板格式。
- 模板画好后了下一步做的是写打印水晶报表的方法了。首先把数据查询和筛选出来,将查出来的数据转化为DataTable格式,这里会调用懂一个封装好的方法,将查出来的数据传到这个已经封装好的方法里,(代码源于教学代码)
public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
{
//定义要返回的DataTable对象
DataTable dtReturn = new DataTable();
//保存列集合的属性信息数组
PropertyInfo[] oProps = null;
if (varlist == null)
return dtReturn;//安全性检查
//循环遍历集合,使用反射获取类型的属性信息
foreach (T rec in varlist)
{
//使用反射获取T类型的属性信息,返回一个PropertyInfo类型的集合
#region
if (oProps == null)
{
oProps = ((Type)rec.GetType()).GetProperties();
//循环PropertyInfo数组
foreach (PropertyInfo pi in oProps)
{
//得到属性的类型
Type colType = pi.PropertyType;
//如果属性为泛型类型
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
{
//获取泛型类型的参数
colType = colType.GetGenericArguments()[0];
}
//将类型的属性名称与属性类型作为DataTable的列数据
dtReturn.Columns.Add(pi.Name, colType);
}
}
#endregion
//新建一个用于添加到DataTable中的DataRow对象
DataRow dr = dtReturn.NewRow();
//循环遍历属性集合
foreach (PropertyInfo pi in oProps)
{
//为DataRow中的指定列赋值
dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);
}
//将具有结果值的DataRow添加到DataTable集合中
dtReturn.Rows.Add(dr);
}
return dtReturn;//返回DataTable对象
}
它将以DataTable格式返回给我们。接下来就是处理数据源与水晶报表。下面还有几个重要的小步骤,我们需要要掌握这过程,因为做打印水晶报表都是这几个过程了
- 实例化数据集
- 将dbReport放入数据集中名为"tbAchievement"的表格中
- 实例化数据报表
- 获取报表的物理文件的路径
- 将报表加载报表模板中
- 设置报表的数据源 SetDataSource:数据源
- 将报表转为文件流输出
//将查出来的数据转化为DataTable格式
DataTable dbResult = LINQToDataTable(listResult);
//1、实例化数据集
PrintReport.ReportDB dbReport = new PrintReport.ReportDB();
//2、将dbReport放入数据集中名为"tbAchievement"的表格中
dbReport.Tables["tbAchievement"].Merge(dbResult);
//3、实例化数据报表
PrintReport.AchievementReport rp = new PrintReport.AchievementReport();
//4、获取报表的物理文件的路径
string strRpPath=Server.MapPath("~/") + "Areas\\ExaminationManagement\\PrintReport\\AchievementReport.rpt";
//5、将报表加载报表模板中
rp.Load(strRpPath);
//6、设置报表的数据源 SetDataSource:数据源
rp.SetDataSource(dbReport);
//7、将报表转为文件流输出
Stream dbStream = rp.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
return File(dbStream, "application/pdf");