利用水晶报表打印数据表格

开发工具与关键技术: VS ,使用水晶报表 。
作者:刘佳明
撰写时间:2019年 5 月 2 日
(注:本文章所使用插件,代码均来源于老师的课件!!!!!)

MVC的使用多为对数据的新增,修改,删除,查询,数据的打印,导出,导入等等。。。
本文将较为详细的阐述,如何利用水晶报表来打印数据表格,,,,

需要将你所查询的数据进行数据打印,首先你需要准备好对应的打印插件,本文使用来源于老师课件中的“水晶报表插件”,具体名称,截图如下;
在这里插入图片描述

下一步,下一步的将水晶报表的插件下载完成之后呢,你需要在对应区域内(若没有使用区域,可直接新建一个文件夹,将水晶报表以添加类的方式,应用即可),新建一个文件夹,添加类的方式,将下载的插件进行应用,
在这里插入图片描述
在这里插入图片描述
ReportDB.xsd 是我们定义的一个数据集,用来定义我们需要打印的数据,方便搭建打印模板,
在这里插入图片描述
构建完我们的数据集后,点击右键,选项,添加 会出现两个不同的英文名称的选项,这两个选项代表了两种不同的构建数据集设计器,
TableAdapter:表示的意思是,通过数据库连表的方式,来构建数据集,
DataTable :表示的是通过自定义的方式来构建数据集 其中需要注意,在使用
需要查看你所添加列的对应C#的数据类型是否正确,string 是否为string datatime 是否为datatime
在这里插入图片描述
待将数据集设计器后,在水晶报表中的数据库字段,中添加好,我们所构建好的数据集,打开水晶报表的插件,
开始进行报表模型的设计;
以下是一个已经设计好了的报表模板,
在这里插入图片描述
水晶报表模板的设计需要注意细心,许多细节要小心的调试,
(默默地说一句,设计这个需要很大的耐心,光小编自己设计就花了一节多课,样式还不怎么的好看,)
打印的模板设计好之后,我们就需要将在控制器中所查询的数据,还有我们设计的模板进行
实例化,具体是代码如下,

DataTable dt = LINQToDataTable(listAchiement);//将listResult转化为DataTable类型数据
            PrintReport.ReportDB myDB = new PrintReport.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);                                                   //把报表文件加载到ReportDocument
            rp.SetDataSource(myDB);                                                     //设置报表数据源
            //
            Stream stream = rp.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);                                                                                //把ReportDocument转化为文件流
            return File(stream, "application/pdf");
//将IEnumerable<T>类型的集合 转换为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类型的集合
                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(new DataColumn(pi.Name, colType));
                    }
                }
                //新建一个用于添加到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对象     }

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值