主要介绍 制作水晶报表的绘画
水晶报表的样式(效果图):
其实水晶报表和导出数据差不多,前提一样是要把表格数据先查询出来,之后再可以根据查询出来的表格内容进行打印。只不过在执行打印当前数据时,必须要先装一个水晶报表的软件。
在打印水晶报表之前要查询一次数据,然后再进行打印(视图)
//打印水晶报表
function printAchievement()
{
layer.confirm("确定要打印当前表格中的数据吗?是请点击确定。否则请先筛选数据再进行打印!", { icon: 3, title: "提示" },
function (layIndex) {
layer.close(layIndex);
window.open("PrintAchievement?" + strConditions);
});
}
(控制器)要给水晶报表设置数据源和画水晶报表的模板。
点击当前文件夹,添加一个新建文件夹,接着再点击添加新建项----数据—数据集,添加完成之后,再到数据集里点击右键添加数据源,也可以添加”DataTable”数据表,自己设置这张数据表里面的字段,然后要根据数据更改数据类型
点击刚刚新建的文件夹,添加:新建项----Reporting,只有装了水晶报表的软件才会有的一个选项,
添加之后会弹出一个窗口,选择–作为空白报表–确定
接下来的步骤:
然后就可以对报表进行“绘画”,因为进来的数据要 一一对应,所以为了保证上面的页眉和下面的详细资料的数据是一一对应,所以选中数据库的字段拖动到详细资料中间的位置,然后松开,这样数据库字段就会既在页眉又在详细资料
,这样就
能保证它们是一一对应的了,然后再改一下页眉的文字就可以了。
这样就算完成了!!!!
最后是控制器的所有代码:
public ActionResult PrintAchievement(int AcademeID,int GradeID,int ClassID)
{
#region 数据查询&筛选
//语句描述:Linq使用group by分组按UserID用户ID查询出用户最高的成绩信息
//group by分组语法:group tbAchievement by tbAchievement.UserID into tbStudent
//表示对tbAchievement按UserID字段进行分组,其结果命名为tbStudent
//一旦重新命名,tbAchievement的作用域就结束了,所以,最后select时,只能select tbStudent
var listAchievement = from tbAchievement in myModels.PW_Achievement
group tbAchievement by tbAchievement.UserID into tbStudent
select new
{
UserID = tbStudent.Key,//Key属性:返回进行分组的关键字段的值
AchievementID = tbStudent.OrderByDescending(m => m.Achievement).FirstOrDefault().AchievementID,
Achievement = tbStudent.OrderByDescending(m => m.Achievement).FirstOrDefault().Achievement,
ExamNumber = tbStudent.OrderByDescending(m => m.ExamNumber).FirstOrDefault().ExamNumber,
EligibleTypeID = tbStudent.OrderByDescending(m => m.Achievement).FirstOrDefault().EligibleTypeID
};
List<AchievementVo> listResult = (from tbAchievement in listAchievement
join tbStudent in myModels.PW_Student on tbAchievement.UserID equals tbStudent.UserID
join tbClass in myModels.SYS_Class on tbStudent.ClassID equals tbClass.ClassID
join tbEligibleType in myModels.SYS_EligibleType on tbAchievement.EligibleTypeID
equals tbEligibleType.EligibleTypeID
orderby tbAchievement.Achievement descending
select new AchievementVo
{
StudentNumber = tbStudent.StudentNumber,//学号
StudentName = tbStudent.StudentName,//姓名
StudentSex = tbStudent.StudentSex,//性别
Class = tbClass.ClassName,//班级
Achievement = tbAchievement.Achievement,//最优成绩
EligibleType = tbEligibleType.EligibleTypeName,//合格类型
AcademeID = tbStudent.AcademeID,
GradeID = tbStudent.GradeID,
ClassID = tbStudent.ClassID
}).ToList();
//条件筛选
if (AcademeID > 0)
{
listResult = listResult.Where(m => m.AcademeID == AcademeID).ToList();
}
if (GradeID > 0)
{
listResult = listResult.Where(m => m.GradeID == GradeID).ToList();
}
if (ClassID > 0)
{
listResult = listResult.Where(m => m.ClassID == ClassID).ToList();
}
#endregion
//将查询出来的数据转化为DataTable的格式
DataTable dtResult = LINQToDataTable(listResult);
//1、实例化数据集
PrintReport.ReportDB dbReport = new PrintReport.ReportDB();
//2、将dtResult放入数据集中名为“tbAchievement”的表格中
dbReport.Tables["tbAchievement"].Merge(dtResult);
//3、实例化数据报表
PrintReport.AchievementReport rp = new PrintReport.AchievementReport();
//4、获取报表的物理文件路径
string strRpPath = Server.MapPath("~/") + "Areas\\ExaminationManagement\\PrintReport\\AchievementReport.rpt";
//5、将报表加载到报表模板中
rp.Load(strRpPath);
//6、设置报表的数据源
rp.SetDataSource(dbReport);
//7、将报表转化为文件流输出
Stream dbStream = rp.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
//返回
return File(dbStream, "application/pdf");
}
/// <summary>
/// 将IEnumerable<T>类型的集合转换为DataTable类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="varlist"></param>
/// <returns></returns>
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对象
}