Vs里的水晶报表

主要介绍 制作水晶报表的绘画

水晶报表的样式(效果图):
在这里插入图片描述

其实水晶报表和导出数据差不多,前提一样是要把表格数据先查询出来,之后再可以根据查询出来的表格内容进行打印。只不过在执行打印当前数据时,必须要先装一个水晶报表的软件。

在打印水晶报表之前要查询一次数据,然后再进行打印(视图)

//打印水晶报表
        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对象
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值