打印报表

                                                                       打印报表

   在软件系统中不仅仅表格数据的显示,有时候还会用到打印报表功能,把数据打印在纸上,当我们学打印水晶表时候,不知大家有没疑没问呢?水晶报表是什么?主要有什么用处?

在课堂上看到仅仅就是一个表而跟普通的没什么两样(如下图)

但是我觉得还是很好奇,课后回到宿舍还是有点想不懂,于是借助网上的力量查了一下,

解析是这样子的:原名Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表。水晶报表是业内最专业、功能最强的报表系统,它除了强大的报表功能外。最大的优势是实现了与绝大多数流行开发工具的集成和接口。在VS.Net平台做过报表开发的程序员,一定都对水晶报表强大、高效、集成等特性留下了深刻印象。 除了开发新程序外,在工作中我们常需要接触到很多较早的软件系统报表功能升级的需求,如果能结合水晶报表这一强大的工具,往往能事半功倍,经过自己思考,在去寻找想要的答案,到解开心中的疑惑感觉挺愉快的

  1. 做打印水晶报表之前我们要安装好水晶报表安装包,安装好后在VS直接可以使用了,水晶报表安装也很简单,点击setup.exe运行后下一步下一步直到安装完成就OK了

  1. 点击打印表格显示出来就有表格的样式,如1图中的表格样式,是怎么做到的呢?是要我们画出来的,那么是怎么画出来的呢?

首先在那个域里面要建一个文件夹,文件夹里面有两个文件

第一个是设计数据源,表格的字段,也相当于设计了一个表格吧,这些字段数据类型要和数据库类型一样(注意:这一步较重要)

第二个是水晶报表模板,把这个模板画出来,打印的时候就按照这个格式打印显示出来

  1. 开始对原始的画板进行描画,画成我们想要的模板格式。

  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格式返回给我们。接下来就是处理数据源与水晶报表。下面还有几个重要的小步骤,我们需要要掌握这过程,因为做打印水晶报表都是这几个过程了

  1. 实例化数据集
  2. 将dbReport放入数据集中名为"tbAchievement"的表格中
  3. 实例化数据报表
  4. 获取报表的物理文件的路径
  5. 将报表加载报表模板中
  6. 设置报表的数据源   SetDataSource:数据源
  7. 将报表转为文件流输出

  //将查出来的数据转化为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");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
reprint 使用说明 直接从datasource,dbgrid,stringgrid导入数据, 只需简单设置,不用手工制作,即可生成您需要的报表,具有预览功能。即可自定义纸张,又可适应 打印机默认纸张。各种打印设置,功能更强大。 一 、控件属性: 1、colstitle 设置报表的列标题属性 (1)alignment 列标题对齐方式。 (2)font 列标题字体 (3)print 设置是否打印列标题 (4)rowspace 列标题行的高度 2、datasource 选择要打印的datasource 3、dbgrid 选择要打印的dbgrid 4、stringgrid 选择要打印的stringgrid 5、detail 设置要打印的明细数据属性 (1)arrange 设置明细字段排列方向 Horizontal 横向打印(默认的一般打印) Vertical 竖向打印(字段竖向排列适合打印字段内容较长的报表如“会议纪录”) (2)aotureturn 打印明细字段时,如果字段超过列的宽度是否允许自动换行 (3)colsline 设置竖线属性引用tpen类 (4)footer 设置明细尾 (5)frame 设置明细边框属性引用tpen类 (6)head 设置明细头同footer (7)rowsline 设置横线属性引用tpen类 (8)rowspace 设置明细行的高度 (9)top 明细与标题的距离 6、page 设置纸张的上下左右边距 7、pagefooter 设置页脚同明细尾 8、pageheader 设置页眉同页脚 9、printobject 选择要打印的对象 (datasource 、dbgrid、 stringgrid ) 10、title 设置标题类页眉、页脚 二 、控件方法: (1) preview 预览 (2) print 打印 (3) SaveToFile() 保存为报表文件 (4) SaveToStream() 保存为流(然后就可把整个报表存到数据库了很方便哦! ~_~) (5) PrintFile() 打印报表文件 (6) PrintStream() 打印流(流的数据库存取就不用多说了吧) (7) PreviewFile() 预览文件 (8) PreviewStream() 预览流 (9) OptionToStream() 报表的属性保存为流 (10) OptionFromStream() 从流中得到报表属性 三、 控件事件: AfterPrint 打印后 BeforePrint 打印前 (本来很多事件,但没有预览,后来加上预览以及一些方法后实现很困难就去掉了!) 四、注意事项 (1) text 属性,输入“¦;#¦;”打印页码值,如果想打印页码可输入“第¦;#¦;页” 输入¦;RecordCount¦;”打印记录数 (2) 不同的打印机,打印和预览效果可能有一点点不同(保证数据打印完全正确一致)。本人用一台针式和一台激光打印机做测试,开始差别较大后经过调试基本一致,不知其他打印机如何。 就这些个吧基本满足了我的软件开发需要,解决了很多问题,关键是做报表省了很大力气,当然了很复杂的报表还是要其它报表控件来解决。如果有其他问题或好的建议可与我联系。 程序设计:吴进昊 E-mail :jinhaowu@hotmail.com qq :54254770 2003.01.03 新增明细栏的左右对齐. 纸张类型、打印方向设置! 标题的每页打印设置。 列标题的每页,每行打印设置。 修改了打印时的错误!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值