C__WinForm实践开发教程-chp7水晶报表技术
- 格式:ppt
- 大小:2.99 MB
- 文档页数:44
1。
第一步是添加新项CrystalReport12。
在CrystalReport1.rpt面页右键选择:”数据库” ”添加/删除数据库”出现下面对话框:然后点开OLE DB(ADO)的加号,将弹出选择数据库的对话框其中”项目数据”里面的”当前连接”显示的就是OLE DB(ADO)的连接,这样就可以将表添加到右边的”选定的表”中了(切记:不要既从”OLE DB”中选表或命令又从”当前连接”中选,如果你用了数据集,也是一样的道理,否则全提示出”登陆失败”的错误!)3。
字段资料管理器里面”数据库字段”里把字段直接拖到CrystalReport.rpt里面了.布置好布局.4。
回到WebForm1.aspx页面,选择控件CrystalReportViewer将其放到页面上。
5。
代码using CrystalDecisions.Shared;using CrystalDecisions.CrystalReports.Engine;在WebForm1.aspx.cs的Form_Load里面添加代码:TableLogOnInfo logOnInfo = new TableLogOnInfo();ReportDocument rpdMy0= new ReportDocument();logOnInfo.ConnectionInfo.ServerName = "NNN";logOnInfo.ConnectionInfo.Password="dong";logOnInfo.ConnectionInfo.DatabaseName="Lab";erID = "sa";String path = Server.MapPath("CrystalReport2.rpt");rpdMy0.Load(path);rpdMy0.Database.Tables[0].ApplyLogOnInfo(logOnInfo);CrystalReportViewer1.ReportSource = rpdMy0;其中:TableLogOnInfo类是:提供属性,以便检索和设置表连接选项.它有一个连接的属性ConnectionInfo,用来设置与数据库的连接.如上面的ServerName等.生成一个报表文档对象将前面我们做好的那个CrystalReport1.rpt赋给它.在这里要注意的是Database属性!然后把报表对象做为CrystalReportViewer1的数据源.或者,获得数据库的方法改为直接从数据库获得DataSetusing System.Data.SqlClient;using System.Collections.Specialized;string strConn=System.Configuration.ConfigurationSettings. AppSettings["DB"].ToString();using (SqlConnection conn = new SqlConnection(strConn)) {SqlDataAdapter da = new SqlDataAdapter(strSQL,conn); //strSQL是SQL语言"select * from dbo.table1"DataSet ds=new DataSet();da.Fill( ds);CrystalReport1 cr1 = new CrystalReport1();cr1.SetDataSource( ds);CrystalReportViewer1.ReportSource = cr1;}using CrystalDecisions.Shared;using CrystalDecisions.CrystalReports.Engine;在WebForm1.aspx.cs的Form_Load里面添加代码:TableLogOnInfo logOnInfo = new TableLogOnInfo();ReportDocument rpdMy0= new ReportDocument();logOnInfo.ConnectionInfo.ServerName = "NNN";logOnInfo.ConnectionInfo.Password="dong";logOnInfo.ConnectionInfo.DatabaseName="Lab";erID = "sa";String path = Server.MapPath("CrystalReport2.rpt");rpdMy0.Load(path);rpdMy0.Database.Tables[0].ApplyLogOnInfo(logOnInfo);CrystalReportViewer1.ReportSource = rpdMy0;其中:TableLogOnInfo类是:提供属性,以便检索和设置表连接选项.它有一个连接的属性ConnectionInfo,用来设置与数据库的连接.如上面的ServerName等.生成一个报表文档对象将前面我们做好的那个CrystalReport1.rpt赋给它.在这里要注意的是Database属性!然后把报表对象做为CrystalReportViewer1的数据源.或者,获得数据库的方法改为直接从数据库获得DataSetusing System.Data.SqlClient;using System.Collections.Specialized;string strConn=System.Configuration.ConfigurationSettings. AppSettings["DB"].ToString();using (SqlConnection conn = new SqlConnection(strConn)) {SqlDataAdapter da = new SqlDataAdapter(strSQL,conn); //strSQL是SQL语言"select * from dbo.table1"DataSet ds=new DataSet();da.Fill( ds);CrystalReport1 cr1 = new CrystalReport1();cr1.SetDataSource( ds);CrystalReportViewer1.ReportSource = cr1;}using CrystalDecisions.Shared;using CrystalDecisions.CrystalReports.Engine;在WebForm1.aspx.cs的Form_Load里面添加代码:TableLogOnInfo logOnInfo = new TableLogOnInfo();ReportDocument rpdMy0= new ReportDocument();logOnInfo.ConnectionInfo.ServerName = "NNN";logOnInfo.ConnectionInfo.Password="dong";logOnInfo.ConnectionInfo.DatabaseName="Lab";erID = "sa";String path = Server.MapPath("CrystalReport2.rpt");rpdMy0.Load(path);rpdMy0.Database.Tables[0].ApplyLogOnInfo(logOnInfo);CrystalReportViewer1.ReportSource = rpdMy0;其中:TableLogOnInfo类是:提供属性,以便检索和设置表连接选项.它有一个连接的属性ConnectionInfo,用来设置与数据库的连接.如上面的ServerName等.生成一个报表文档对象将前面我们做好的那个CrystalReport1.rpt赋给它.在这里要注意的是Database属性!然后把报表对象做为CrystalReportViewer1的数据源.或者,获得数据库的方法改为直接从数据库获得DataSetusing System.Data.SqlClient;using System.Collections.Specialized;string strConn=System.Configuration.ConfigurationSettings. AppSettings["DB"].ToString();using (SqlConnection conn = new SqlConnection(strConn)) {SqlDataAdapter da = new SqlDataAdapter(strSQL,conn);//strSQL是SQL语言"select * from dbo.table1"DataSet ds=new DataSet();da.Fill( ds);CrystalReport1 cr1 = new CrystalReport1(); cr1.SetDataSource( ds);CrystalReportViewer1.ReportSource = cr1;}。
WinForm中使⽤CrystalReport⽔晶报表——基础,分组统计,⾃定义数据源开篇本篇⽂章主要是帮助刚开始接触CrystalReport报表的新⼿提供⼀个循序渐进的教程。
该教程主要分为三个部分1)CrystalReport的基本使⽤⽅法;2)使⽤CrystalReport对数据进⾏分组求和;3)CrystalReport如何使⽤⾃定义的数据源(如内存中的DataTable表)三个⽅⾯来写。
相信看懂了这个教程之后,对于⾃⼰项⽬中的实现报表这⼀功能,应该就能轻松的应对了。
⼀ CrystalReport模板的制作及显⽰A模板的制作1、右键【项⽬属性】添加⼀个⽔晶报表(在vs中需要安装CrystalReport模块,不同vs版本下载不同的CrystalReport版本:CrystalReport下载链接:)2、添加报表的设计界⾯如下:⼀个报表包括(报表头,页眉,详细资料,报表尾,页眉)5个基本部分。
3、现在我们需要给新建的报表添加⼀个数据源,右键左边的【数据库字段】选择相应的数据源,进⾏绑定。
我这⾥选择的是sqlserver数据库。
4、输⼊数据库的登录信息,然后选择需要绑定的数据库表,除了绑定数据表之外,还可以绑定sql语句查询的结果,以及存储过程和视图,下⾯给出绑定数据库表格,和绑定sql查询。
1)绑定数据库表格2)点击连接下⾯的【添加命令】绑定sql语句。
5、绑定数据库之后在报表左侧的【字段管理器】中就会出现该表以及sql查询结果的的相应表头字段。
6、把相应的字段在报表视图中进⾏布局。
到此⽔晶报表的模板已经做好了。
注意:页眉中的userName,courseName,score是可以更改。
B模板的显⽰1、⾸先在窗体上拖⼀个CrystalReportView控件作为显⽰报表模板。
2、在form_load事件⾥⾯写如下代码:CrystalReport1 cr = new CrystalReport1();//实例化⼀个报表模板this.crystalReportViewer1.ReportSource = cr;//为报表显⽰控件设置数据源3、运⾏报表设计点丑,但是你可以根基⾃⼰的风格进⾏排版设计,如字体,⼤⼩,颜⾊等啦。
c#水晶报表入门教程:对比FineReport之用户入门水晶报表(crystal report)和FineReport都是很常用的报表工具,这里对比一下它们的用户入门功能。
水晶报表用户入门如下:新用户快速入门下面的教程帮助您在创建第一张报表时即树立信心。
请使用本联机帮助的“目录”选项卡在教程中进行浏览。
在本教程中,当创建“客户列表”报表时,会获得有关该程序的介绍。
“客户列表”是最基本的商务报表,一般含有诸如客户名称、城市、地区和联系人姓名之类的信息。
现在开始学习基本概念:选择数据库,在报表中放置一些字段,然后选择要包含的特定记录。
接下来学习如何:插入和移动数据库字段。
添加标题并设置格式。
在“预览”选项卡中显示报表,以便可以精细调整报表。
使用“选择专家”以确保在报表中只包含所需的数据。
移动对象。
数据分组及排序。
插入图片。
打印报表。
开始之前本教程假设您已经熟悉了Microsoft Windows,并使用Windows环境中常见的惯用术语和过程。
如果您还不熟悉Windows,请参考Microsoft Windows文档,以获得进一步的解释。
程序中所有报表节的默认字体都设置为宋体、10磅。
如果更改了默认字体,或者打印机不支持这种字体,那么字段大小、字段间距和屏幕显示看上去将和教程中的不一样。
本教程是在Microsoft Windows2000平台上设计的。
如果使用不同的平台,则屏幕显示可能略有不同。
如果您还不熟悉Crystal Reports环境,请查看格式化,其中介绍了如何使用网格、自由格式位置、使用准线及格式设置活动。
创建报表1.单击“标准”工具栏上的“新建”。
Crystal Reports库出现。
2.3.库中包含了许多向导,用于指导您创建特定类型的报表。
因为在此处是学习报表的概念,所以可以跳过向导,从头开始创建报表。
在完成本教程的学习之后,可以使用向导创建一些报表,以比较哪种报表创建方法最适合您。
NET水晶报表首先要从概念入手,水晶报表(Crystal Report)是业内最专业、功能最强的报表系统,它除了强大的报表功能外,最大的优势是实现了与绝大多数流行开发工具的集成和接口。
1、.NET水晶报表的好处1)利用水晶报表可以进行数值求平均值,画图等2)利用水晶报表可以把文件导出不同的格式(word等)2、.NET水晶报表的两种格式1)pull模式,不利用DataSet,直接从数据库中取出数据2) push模式,使用DataSet,利用它进行数据的加载和处理等3. .NET水晶报表使用的库1)水晶报表的引擎(CREnging.dll),作用:合并数据,装换格式2)水晶报表设计器(CRDesigner.dll),作用:设计标题,插入数据等3)水晶报表查看控件(CRWebFormViewer.DLL)4)需要引入的命名空间ing CrystalDecisions.CrystalReports.Engine;ing CrystalDecisions.Shared;4、Pull模式下使用水晶报表1)创建rpt文件2)拖放CrystalReportViewer3)绑定5、读取.NET水晶报表文件3.private void ReadCRV(cryatalReportViewer crv)4. {5. openFileDialog dlg=new OpenFileDialog();6.dlg.Title="打开水晶报表文件";7.dlg.Filter="水晶报表文件(*.rpt)|*.rpt|所有文件|*.*";8. if(dlg.showDialog()==DialogResult.OK)9. {10.crv.ReportSource=dlg.FileName;11. }12. }6. B/S下读取报表的文件13.private void ReadCRV(cryatalReportViewer crv,File file)14. {15. string strName=file.PostedFile.FileName;16. if(strName.Trim()!="")17. {18.crv.ReportSource=strName19. Session["fileName"]=strName;20. }21. }在B/S中要防止数据源的丢失22.priavte void Page_Load(object sender,System.EventArgs e)23. {24. if(Session["fileName"]!=null)25. {26.crv.ReportSource=Session["fileName"].ToString();27. }28. }7. 假如直接从数据库中读取数据采用PULL模式可能出现错误(登录的用户名和密码不对)29.private void ReadCRV(CrystalReportViewer crv,CrystalReport cr)30. {31. ReportDocument reportDoc=new ReportDocument();32. reportDoc.Load(Server.MapPath(cr));//要加载的rpt文件的名字33. //解决登录的问题34. TableLogOnInfo logonInfo = new TableLogOnInfo();35. foreach(Table tb in ReportDoc.Database.Tables)36. {37.logonInfo=tb.LogOnInfo;38.logonInfo.ConnectionInfo.ServerName="(loacl)";39.logonInfo.ConnectionInfo.DatabaseName="Pubs";erId="sa";41.logonInfo.ConnectionInfo.Password="";42. tb.ApplyLogOnInfo(logonInfo);43. }44.crv.ReportSource=reportDoc;45. }8. 采用Push模式,直接在数据源读取46.private void BindReport(CrystalReportViewer crv)47. {48. string strProvider="Server=(local);DataBase=pubs;uid=sa;pwd=";49. CrystalReport cr=new CrystalReport();50. DataSet ds=new DataSet();51. SqlConnection conn=new SqlConnection(strProvider);52. conn.open();53. string strSql="select * from jobs";54. SqlDataAdapter dap=new SqlDataAdapter(strSql,conn);55. adp.Fill(ds,"jobs");56. cr.SetDataSource(ds);57.cr crv.ReportSource=cr;58. }9. 导出水晶报表的文件59.private void ExportCrv(CrystalReport cr)60. {61. DiskFileDestionOptions dOpt=new DiskFileDestionOptions();62.cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();63.cr.ExportOptions.ExportFormatType= ExportFormatType.PortableDocFormat;64.dOpt.DiskFileName="C:\output.pdf";65.cr.ExportOptions.DestinationOptions=dOpt;66. cr.Export();67.68. }69. private void ExportCrv(CrystalReport cr,string strType,string strPath)70. {71. DiskFileDestionOptions dOpt=new DiskFileDestionOptions();72.cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();73. switch(strType)74. {75. case "RTF":76.cr.ExportOptions.ExportFormatType=ExportFormatType.RichText;77.dOpt.DiskFileName=strPath;78. break;79. case "PDF":80.cr.ExportOptions.ExportFormatType=ExportFormatType.PortableDocFormat;81.dOpt.DiskFileName=strPath;82. break;83. case "DOC":84.cr.ExportOptions.ExportFormatType=ExportFormatType.WordForWindows;85.dOpt.DiskFileName=strPath;86. break;87. case "XLS":88.cr.ExportOptions.ExportFormatType=ExportFormatType.Excel;89.dOpt.DiskFileName=strPath;90. break;91. default;92. break;93.94. }95.cr.ExportOptions.DestinationOptions=dOpt;96. cr.Export();97.98. }10 B/S下水晶报表的打印99.priavte void PrintCRV(CrystalReport cr)100. {101. string strPrinterName=@"printName";102. PageMargins margins=cr.PrintOptions.PageMargins; 103.margins.bottomMargin = 250;104.margins.leftMargin = 350;105.margins.rightMargin = 350;106.margins.topMargin = 450;107. cr.PrintOptions.ApplyPageMargins(margins);108.cr.PrintOptions.printerName=strPrinterName;109. cr.PrintToPrinter(1,false,0,0)//参数设置为0,表示打印所用页110. }。
c#水晶报表入门教程:对比FineReport之报表填报水晶报表(crystal report)和FineReport都是很常用的报表工具,这里对比一下它们的报表填报功能。
表单表单的回填是水晶报表(Crystal Report)完全不能支持的功能。
FineReport 支持基于纯HTML的表单回填,支持各种主流的浏览器。
编辑风格表单提供普通文本编辑框、复选框、下拉列表框、下拉日历、文件上传等。
自动计算表单可支持类似EXCEL的自动计算功能,程序根据用户的设置在前端生成JavaScript表达式完成自动计算。
自动计算还可跨表,多sheet之间的相互运算。
数据的扩展允许报表单元格与数据库字段间任意对应,并有自动扩展的能力。
支持任意格式的表单回填数据。
直接回填到数据库用户填写的数据,都直接存储到数据库当中,无需中间环节。
多级汇总填报表单的报表同时还是个统计表,单元格数据可以有不同的来源和去向,这样可以先从下级机构汇总出数据再加以补充修改后填写到上级数据库中。
FineReport报表,其制表效率十倍于以国外产品为代表的传统报表工具。
对比点FineReport CrystalReport应用集成后台的环境支持纯JAVA,全支持个别产品只支持Windows前台的环境支持纯HTML,全支持一般仅支持IEJ2EE的应用服务器管理嵌入应用,可充分利用应用服务器各项能力独立服务器,应用服务器能力不可利用J2EE的WEB部署与应用统一部署单独安装部署,操作繁琐J2EE的应用接口丰富齐全,结合紧密通过网络协议,力度不足,统计图常采用古老的CGI方式Java Application集成支持非纯JAVA的不支持.NET的应用集成支持,独立服务支持页面的集成完全随意嵌入独立门户,很困难用户权限控制与应用程序一致独立机制很繁琐IDE集成能力有限支持不支持并发能力较强,4万单元格表在512M内存可并发50个以上基础程序对内存要求很高,并发数较少数据设计多数据源(集)直接间接支持完全分组(多层)支持支持,较繁琐完全交叉(多层)支持,无须专门处理支持,用专门的交叉模型不完全分组/固定行列支持编程准备数据上下分片支持,上下格式可不一致,固定变动混合格式一致的可编程准备数据,否则必须拼子表完成左右分片支持,固定变动混合,直接运算性能高固定列的可编程准备数据,采用DB叉乘性能很差跨行组运算支持,随意通用固定的简单跨行运算,跨组不支持独立格运算支持,随意通用固定几种运算,来自DB的要专门处理主从报表无须子表概念即可完成须用子表,数据无法沟通子表多层任意,格线可对一般两层,横向表不齐可缩放,横纵向均可自动摆位可自动摆位参数与宏均支持仅支持参数报表展现基本方案EXCEL网格式,方便快捷控件式,对齐繁琐导入EXCEL支持不支持套打绘制底图描绘精确度量报表输出格式标准HTML,PDF,word完全不失真的EXCEL,带格式文本PDF,特殊HTML,丧失格式的EXCEL,无格式文本统计图输出格式GIF,JPG,PNG GIF,JPG打印分页分栏横纵向均可,强制分页仅支持纵向,且不可分栏其它打印控制一纸多页,补空行,缩放缩放表单编辑风格文字编辑、下拉选择等不支持自动计算支持合法性检查支持数据库对应随意自动,行/列/交叉均可多级汇总填报支持部署和应用集成WEB部署FineReport报表工具的服务程序以JAR包形式出现,可与应用程序统一打成包一起部署在应用服务器上,安装非常轻松。
水晶报表基础操作从入门到精通1、水晶报表注册码在使用自带的水晶报表时,请注册,否则只能使用30次,水晶报表注册码如下:注册号:6707437608密码:AAP5GKS0000GDE100DS2、中使用水晶报表我们采用下面的几步使用Push模式执行水晶报表:1设计一个DataSet右击“解决方案浏览器”,选择“添加”--“添加新项”-->“数据集”,从“服务器资源管理器”中的“SQL Server”中拖放“Stores”表(位于PUBS数据库中)。
再将此表拖入数据集中。
而 .xsd文件中仅仅包含一个结构图,但是不会有任何数据在里面。
2创建一个.rpt文件同时将其指定给上一步建立的DataSet。
使用上面的介绍过的方法创建此文件,唯一的不同就是使用数据集来代替前面的直接连接数据。
建立.rpt文件之后,右击“详细资料”-->“添加/删除数据库”,在”数据库专家“窗口中,展开”项目数据“(代替以前的OleDb),展开“数据集”--“DataSet1”,选择“Stores”表。
将“Stores”表添加到“选定的表”中,点击“OK”。
3在aspx页面中拖放一个CrystalReportViewer控件同时将其与前面的rpt文件建立联系。
使用PULL模式下的方法,建立一个WebForm,添加一个Crystal Report Viewer 控件,并设定其属性,此处与PULL模式下是一致的。
代码如下:private void Page_Load(object sender, System.EventArgs e{DataSet1 ds = new DataSet1(;oCR = new MyReport(;SqlConnection MyConn = newSqlConnection(ConfigurationSettings.AppSettings["SqlConn"];MyConn.Open(;//直接访问数据表//string strSel = "select * from tbtree";//SqlDataAdapter MyAdapter = new SqlDataAdapter(strSel,MyConn;//MyAdapter.Fill(ds,"tbtree";//使用存储过程SqlCommand cmd = new SqlCommand("display", MyConn;mandType = CommandType.StoredProcedure;SqlDataAdapter MyAdapter = new SqlDataAdapter(cmd;MyAdapter.Fill(ds,"tbtree";oCR.SetDataSource(ds;}注意:在上面的代码中,你得注意一下oRpt是"Strongly Typed"的报表文件。
获取宾馆的身份证读卡器读取的信息,然后用报表打印出来,双击左边的列表里面的客户名字,在右边显示信息,然后可以打印出来,点击“获取最新客人信息”按钮会获得最新登记的客人信息。
用到的技术:水晶报表(通过数据库推送数据生成新的报表类容)访问ACCSEE数据库C#winForm编程C#访问ACCESS数据库、动态生成水晶报表、C#和水晶报表、水晶报表打印纸张设置、C#获取系统默认打印机的选定纸张所用软件:ACCESS2007VS2010水晶报表2008整个C#项目主要文件如下图:crystalReport1.rpt为报表模板文件dataset1.xsd为数据集框架,有个自定义的数据表,包含报表模板文件(crystalReport1.rpt)里面用的一些字段,用SQL语句向其中填充数据,然后附加给报表,生成报表XMLFile.xml为添加的一个xml配置文件,里面保存的有ACCESS数据库的访问密码信息,在随时手动更改using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.OleDb;using CrystalDecisions.ReportSource;using CrystalDecisions.CrystalReports.Engine;using System.Drawing.Printing;using System.Xml;namespace getPeopleInfo{public partial class Form1 : Form{public Form1(string str1){InitializeComponent();GetConnectString = str1;}private string connectString;protected string GetConnectString{get { return connectString; }set { connectString = value; }}OleDbConnection localConnectStr = new OleDbConnection(); //定义针对access数据库的的OleDb类型的连接对象ReportDocument myreport = new ReportDocument();DataSet1 datasetForRpt = new DataSet1(); //DataSet1是一个数据库集模型,这里创建一个它的实例引用,专门用于给水晶报表推送数据的DataSet datasetForCustList = new DataSet(); //定义客人列表数据集string rptPathString = AppDomain.CurrentDomain.BaseDirectory + "CrystalReport1.rpt"; //当把报表模型文件放在debug文件里面的时候用此语句获取报表的完整路径private void Form1_Load(object sender, EventArgs e){localConnectStr.ConnectionString = GetConnectString;myreport.Load(rptPathString); //加载报表myreport.SetDataSource(datasetForRpt); //设置报表数据源Printbutton.Enabled = false; //打印按钮暂时不可用,因为报表还没显示出数据}private void newCustPrint_Click(object sender, EventArgs e) //双击listBox框里面的选项事件{datasetForRpt.Clear(); //清除报表数据集中的数据OleDbDataAdapter dataAdapterGetCusList = new OleDbDataAdapter("SELECT top 1 姓名,性别,民族,出生,公民身份号码,住址,CStr(读取时间) as 读取时间FROM 身份证信息order by 读取时间desc ", localConnectStr);dataAdapterGetCusList.Fill(datasetForRpt, "DataTable1");myreport.SetDataSource(datasetForRpt);PrintDialog pd1 = new PrintDialog();int rawkind = pd1.PrinterSettings.DefaultPageSettings.PaperSize.RawKind;myreport.PrintOptions.PaperSize = (CrystalDecisions.Shared.PaperSize)rawkind;//把枚举数值转换为纸张类型//myreport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.DefaultPaperSize;this.crystalReportViewer1.ReportSource = myreport;Printbutton.Enabled = true;}private void buttonGetCustList_Click(object sender, EventArgs e){listBoxCustomers.Items.Clear(); //清除列表里面已经有的项,防止重复显示datasetForCustList.Clear(); //清空内存中的客人列表数据集中的数据,防止重复添加OleDbDataAdapter dataAdapterGetnewCus = new OleDbDataAdapter("SELECT 姓名,公民身份号码,CStr(读取时间) as 读取时间FROM 身份证信息where 读取时间>#"+dateTimePicker_begin.Value.ToShortDateString()+" 00:00:00# and 读取时间<#"+dateTimePicker_end.Value.ToShortDateString()+" 23:59:59# order by 读取时间", localConnectStr);dataAdapterGetnewCus.Fill(datasetForCustList);foreach (DataRow dr in datasetForCustList.Tables[0].Rows){listBoxCustomers.Items.Add(dr[0].ToString() + " " + dr[1].ToString() + " " +dr[2].ToString());listBoxCustomers.Items.Add("\r\n"); //添加回车换行符}}private void listBoxCustomers_DoubleClick(object sender, EventArgs e){if (listBoxCustomers.Items.Count>0&&(listBoxCustomers.SelectedIndex>=0)&&(listBoxCustomers.SelectedItem.ToString()!="\r\n")){datasetForRpt.Clear();string[] sArray = listBoxCustomers.SelectedItem.ToString().Split(' ');OleDbDataAdapter dataAdapterGetCusList = new OleDbDataAdapter("SELECT distinct 姓名,性别,民族,出生,公民身份号码,住址,CStr(读取时间) as 读取时间FROM 身份证信息where 姓名='"+sArray[0]+"' and 公民身份号码='"+sArray[2]+"' and CStr(读取时间)='"+sArray[4]+" "+sArray[5]+"'", localConnectStr);//OleDbDataAdapter dataAdapterGetCusList = new OleDbDataAdapter("SELECT distinct 姓名,性别,民族,出生,公民身份号码,住址,读取时间FROM 身份证信息where 姓名='" + sArray[0] + "' and 公民身份号码='" + sArray[2] + "' and 读取时间=Cdate('" + sArray[4] + " " + sArray[5] + "')", localConnectStr); 用CDate函数也行dataAdapterGetCusList.Fill(datasetForRpt, "DataTable1");myreport.SetDataSource(datasetForRpt);PrintDialog pd1 = new PrintDialog();int rawkind = pd1.PrinterSettings.DefaultPageSettings.PaperSize.RawKind; //获取打印机首选项中的打印纸张类型的枚举数值myreport.PrintOptions.PaperSize = (CrystalDecisions.Shared.PaperSize)rawkind; //把枚举数值转换为纸张类型,并设置报表的打印纸张类型为系统默认打印机首选项中设置的打印纸张类型//myreport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.DefaultPaperSize;//上面一句设置报表的打印纸张类型为系统默认打印机驱动中的默认打印纸张类型,打印机驱动中的默认纸张类型和打印首选项中的纸张类型也许不一样,不用这句this.crystalReportViewer1.ReportSource = myreport; // 生成报表Printbutton.Enabled = true;}}private void buttonPrint_Click(object sender, EventArgs e){myreport.PrintToPrinter(1, false, 0, 0);}private void SearchCustbutton_Click(object sender, EventArgs e){string inputName = textBoxCustName.Text.Replace(" ","");if (inputName.Count() > 1){listBoxCustomers.Items.Clear(); //清除列表里面已经有的项,防止重复显示datasetForCustList.Clear(); //清空内存中的客人列表数据集中的数据,防止重复添加OleDbDataAdapter dataAdapterGetnewCus = new OleDbDataAdapter("SELECT 姓名,公民身份号码,CStr(读取时间) as 读取时间FROM 身份证信息where 姓名like '%"+ inputName +"%' or 公民身份号码='" +inputName+ "'", localConnectStr);dataAdapterGetnewCus.Fill(datasetForCustList);foreach (DataRow dr in datasetForCustList.Tables[0].Rows){listBoxCustomers.Items.Add(dr[0].ToString() + " " + dr[1].ToString() + " " + dr[2].ToString());listBoxCustomers.Items.Add("\r\n"); //添加回车换行符}}else{MessageBox.Show("请输入正确的查询信息!");}}}}。
创建简单水晶报表步骤1:打开VS工具,新建解决方案和项目2:先创建一个一个ds文件,在ds文件中添加一个datatable,并添加需要显示的列(此处的列和你从数据库中查询出来的字段名称相同),右击属性,选择相应字段的相应类型3:创建水晶报表文件(rptShow)选择标准- 在项目数据中找到刚刚创建好的数据集,并选择相应的datatable至右面的文本框中,点击完成,创建好报表文件。
5-1:在我做的报表文件中主要遇到的一个困难是求和;所以这里特别记录下1:新建【运行总计字段】并取名,这里设计名称为:Sum_Qty从报表字段中选择需要求和的字段,在汇总类型中选择和即可,此种方法为其一,还有一种方法则是建立好名称后,在公式工作室选择公式--→函数-→选择需要的函数并把相应的字段填充进去,我这里需要的是数量的求和,所以,选择好后是Sum(Qty) 即可,然后直接把之前创建好的名称放在报表文件中。
2:求和不同类型的数据,则需要进行判断,在我的数据库中有金和石两种数据,所以我要对石和金进行统计并求和。
同样需要创建运行总计字段,Sum_Qty,进入到公式工作室,找到刚刚创建好的运行总计字段名称(Sum_Qty),在右面的空白处写上判断格式:if UOM=’G’ then金的重量字段4:调整好相应的格式,再新建一个项目文件(这里是针对winform程序,web的我还没试过,等试了再写)5:在form表单中拉近一个报表显示控件,如图:6:编写代码实现报表的显示:Dim rpt As New rptDetails ------rptDetails 指的前文创建的报表文件名称Dim ds As New dsSummary.DeatilsQtyDataTable ------dsSummary(创建的数据集文件,DeatilsQtyDataTable 指的是数据集中,你想要使用的数据表,在此使用时,它会自动加上DataTable后缀,其实代表的就是你数据集中的DeatilsQty)rpt.SetDataSource(DBHelper.GetDetailsSummary(ds, PosCodes, txtFrom.Text.Trim,txtTo.Text.Trim)) -----调用方法(该方法返回的是dataTable类型)Me.rptShowDetails.ReportSource = rpt ---填充报表7:完成,显示效果如图:。
为什么水晶报表那么麻烦,每做一张报表都要选表,画线画格子,有没有一种方法可以一劳永逸?做一个模板,然后用不同的表都能用?还有就是能不能动态选择列,而且选择列后能报表能自动适用这个变化?甚至有些人也因为放弃了水晶报表,实际上这些都是水晶报表可以做到的。
在这里,我来讲解一下原理和实现。
希望该文章,能基本上解决这个问题。
当然,这个也不是万能的,也有其适用环境。
本文开发环境:VS2005 / CR XI R2 for .Net第一步:新建一个C#的水晶报表的WinForm空白项目。
在弹出报表数据源选择框的时候,不要选择任何任何数据源,直接点确定,创建一个空白报表。
第二步:项目中添加一个Dataset1.xsd,手工建立一个DataTable,命名为B igTable。
建立6个字段,全部为String型。
为什么用6个呢?这个数字6的确立,是根据你的实际需要,这个表的列的数目,需要大于等于你所需要操作的事实表的最大列数。
用为什么用String型呢?我们知道基本上所有的基础数据类型都可以转换为String,这样我们的这个表基本上可以容纳所有的数据类型。
好了,在报表中添加这个B igtable.将6个字段拖到详细资料节。
对齐。
()注意!不要使用框和线来画格子,这里用的是字段边框,初次操作可以暂时不用,我后面会专门讲一下这个格线的处理。
好了,这样我们的万能模板就做成了。
很简单,是吗?呵呵。
第三步:在w inform上拖上一个combox,一个button,用默认名称接口。
combox1用来选表的名称。
这样界面也完成了。
第四步:实现原理上面的几步下来,有经验的朋友基本上看出来我们是要用PUSH模式来实现了。
既然我们已经在报表里用到了BigTable,那么我们要传递给报表的数据,也就要整形成B igTable的样子。
也就是说,只要能把来源数据表的数据,整形成B igTable的样子,就能用这一个模板显示出来。
而不用管来源表从哪里来,表名是什么,有几个字段(但是字段数目需要小于等于6),字段名是什么,有多少数据。
c#水晶报表入门教程:对比FineReport之图表设计水晶报表(crystal report)和FineReport都是很常用的报开发工具,这里对比一下它们的图表设计功能。
水晶报表图表设计功能如下:图表Crystal Reports使您能够用多彩的、易读的图表显示汇总的数据。
本节介绍如何创建图表,以及如何在报表中使用图表,使得报表数据更有意义并且更易于理解。
不但可以从大量图表布局和类型中选择,而且能够深化以查看图形汇总的详细资料并格式化图表对象。
图表布局“图表专家”提供四种布局,分别对应特定的数据集。
您可以用下列布局中的任意一种来创建图表,并可根据所用数据更改图表的布局。
高级当有多个图表值或在报表中没有分组和摘要字段时,请使用“高级”布局。
“高级”图表布局支持一个或两个条件字段:您可以使用这些条件字段创建二维图表、三维图表或饼图。
“高级”布局中的其他特殊功能包括:数值可按升序、降序、指定的顺序、合计的最前N个或排序来分组。
可为每个记录绘制值。
可为所有记录绘制总计值。
图表可基于公式和运行总计字段。
组“分组”布局是一种简化的布局,可以用来表示国家/地区等主题字段更改时的摘要。
注意:为了用“分组”布局创建图表,您必须至少有一个分组和用于该分组的摘要字段。
交叉表使用“交叉表”布局在交叉表对象上绘制图表。
交叉表图表使用交叉表中的字段作为其条件和摘要字段。
OLAP使用OLAP布局在OLAP网格上绘制图表。
OLAP图表使用OLAP网格中的字段作为其条件和摘要字段。
在详细资料或公式字段上绘制图表(高级布局)“高级”布局允许您根据特定值创建图表。
因为图表是一种表示汇总信息的好方法,所以通常基于报表的汇总字段。
使用“高级”布局,您可以使用报表“详细资料”节的值来创建图表,而无须使用汇总字段。
若要创建基于“高级”布局的图表,您必须指定以下两方面内容:条件(可以有两个)。
值(可以有多个值)。
条件条件用来指定什么时候绘制点。
BS报表制作向导一、制作报表样式1.新建水晶报表样式打开Visual Studio或水晶报表工具,点击菜单条中的文件—新建项目,在弹出的页面中选择其他语言-Visual J#-Crystal Reports应用程序修改名称和位置后,点击确定按钮,再在弹出的页面中选择作为空白报表,再点击确定按钮;如果已有一个水晶报表,要在现有项中再新增一个水晶报表样式,可以在解决方案资源管理器中在解决方案子主目录下,右键-添加新项,弹出以下页面,选择Crystal报表即可水晶报表工具Crystal Reports2008制作报表:工具栏文件->新建->空白报表/标准报表/交叉报表->数据库专家2.将报表数据源绑定数据库在显示的页面中,单击鼠标右键选择数据库-数据库专家在创建新连接中,点击OLE DB(ADO),弹出页面,提供程序中选择Microsoft OLE DB Provide for SQL Server,再点击下一步按钮,在弹出的页面中输入内容后,点击下一步按钮在弹出的页面中点击添加命令,输入SQL查询—报表所需字段(也可以是视图或存储过程),再点击确定按钮。
3.制作水晶报表A.工具箱--在左边工具箱中,可以选择工具画报表,文本对象(文本框及内容的输入),线条对象(画线),框对象(表格外面的框)水晶报表工具Crystal Reports2008:工具栏插入->文本对象/线/框B.字段--在字段中可以直接将要显示在报表中的字段拖放到报表中去C.合计的显示—选中要合计的字段,如金额,点击右键,插入-汇总在弹出的页面中,选择要汇总的字段和方式(求和,差,平均~~)点击确定后自动生成一个汇总字段,将该字段拖放到合计金额的位置即可水晶报表工具Crystal Reports2008:在“公式字段”新建“合计”,汇总字段为CalFee,拖动到页脚D.合计金额小写转换成大写—在右边字段中,选择公式字段,右键-新增(名为test),点击使用专家按钮,在弹出的页面中,选择报表自定义函数,再点击右键-新建,在弹出的页面中输入自定义函数有的名称(AmountToWord2),点击使用编辑器在下面的输入框中,输入以下函数(语法选择Basic语法)选择之前添加的公式字段test,在下面的输入框中输入以下内容(调用上面的函数)(语法选择Basic语法)Function CNMoney(ls As Number) As StringDim dx_sz As StringDim dx_dw As StringDim str_int As StringDim str_dec As StringDim dx_str As StringDim fu As StringDim a As StringDim b As StringDim c As StringDim d As StringDim b2 As StringDim num_int As NumberDim num_dec As NumberDim len_int As NumberDim i As NumberDim a_int As NumberDim pp As Numberdx_sz = "零壹贰叁肆伍陆柒捌玖"dx_dw = "万仟佰拾亿仟佰拾万仟佰拾圆"If ls = 0 ThenCNMoney = "零圆整"Exit FunctionEnd IfIf ls < 0 Thenls = Abs(ls) --返回绝对值fu = "负"Elsefu = ""End Ifdx_str = CStr(ls) --返回表达式,该表达式已被转换为String 子类型的V ariant--Dim MyDouble, MyString--MyDouble = 437.324 - ' MyDouble 是双精度值。
1.新建一个数据集(DataSet1.xsd),这个数据集就是水晶报表的数据源。
2.设计报表样式,设置数据源时选择你新建的数据集3.在程序中编写代码,加载数据DataSet1 dataset = new DataSet1();SqlDataAdapter ap = new SqlDataAdapter();ap.Fill(DataSet1,"这里的表名必须和新建数据集中的表名一样");4.CrystalReport CrystalReport1 = new CrystalReport();CrystalReport1.setdatasource(ds);就是新建一个CrystalReport文件。
CrystalReport CrystalReport1 = new CrystalReport();你所实力化的类型就是刚才新建的CrystalReport文件,你还要加CrystalReportViewer1.ReportSource = CrystalReport1;CrystalReportViewer1在工具栏中有,它是承载报表文件的控件5.Imports CrystalDecisions.CrystalReports.EngineImports CrystalDecisions.WebImports CrystalDecisions.SharedPublic Class Form1Public tempdb As StringPublic temp As StringDim strqx2(10000)Public constr As String = "uid=sa;pwd=sa2000;database=smallsys;server=oa"Public mycon As New System.Data.SqlClient.SqlConnection(constr)Dim x As IntegerDim xx As IntegerPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadIf mycon.State = ConnectionState.Closed ThenTrymycon.Open()Catch ex As ExceptionMsgBox("数据库连接失败!", MsgBoxStyle.Exclamation, "提示")End TryEnd IfDim mcom As New SqlCommand("select remark from RPTdbinfo", mycon)Dim myr As SqlDataReader = mcom.ExecuteReaderWhile myr.ReadEnd Whilemyr.Close()Dim rpt As New CachedCrystalReport1CrystalReportViewer1.ReportSource = rptTreeView1.Enabled = FalseEnd SubPrivate Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelecttemp = TreeView1.SelectedNode.TextTryokey()Catch ex As ExceptionEnd TryEnd SubSub okey()If temp <> "" ThenDim rdPublishers As New ReportDocument()rdPublishers.Load(tmppath(temp))Dim strUserID As String = ""Dim strPassword As String = ""If Trim(tmpkind(CStr(temp))) = "ERP" ThenstrUserID = "sa"strPassword = "******"rdPublishers.SetDatabaseLogon(strUserID, strPassword)End IfIf Trim(tmpkind(temp)) = "MES" ThenstrUserID = "sa"strPassword = "******"rdPublishers.SetDatabaseLogon(strUserID, strPassword)End IfIf Trim(tmpkind(temp)) = "OA" ThenstrUserID = "sa"strPassword = "******"rdPublishers.SetDatabaseLogon(strUserID, strPassword)End IfCrystalReportViewer1.ReportSource = rdPublishersEnd IfEnd SubFunction tmppath(ByVal temp As String) As StringDim strpathDim dbase As New Data.DataSetDim dc As SqlDataAdapterdc = New SqlDataAdapter("select * from RPTpath where RPTname='" & temp & "'", mycon) dc.Fill(dbase, "tbid")strpath = dbase.Tables("tbid").Rows(0)("RPTpath")‘???Return strpathEnd FunctionFunction tmpkind(ByVal temp2 As String) As StringDim strkindDim dbase As New Data.DataSetDim dc As SqlDataAdapterdc = New SqlDataAdapter("select * from RPTpath where RPTname='" & temp2 & "'", mycon) dc.Fill(dbase, "tbid")strkind = dbase.Tables("tbid").Rows(0)("RPTkind")Return strkindEnd FunctionPrivate Sub 首次运行必读RToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 首次运行必读RToolStripMenuItem.Clickinfor.Show()End SubPrivate Sub 关于ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 关于ToolStripMenuItem.ClickEnd SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim strkind As StringDim strqx As StringDim dbase As New Data.DataSetDim dc As SqlDataAdapterdc = New SqlDataAdapter("select * from users where uid='" & Trim(TextBox1.Text) & "'", mycon)dc.Fill(dbase, "tbid")strkind = Trim(dbase.Tables("tbid").Rows(0)("pass"))strqx = Trim(dbase.Tables("tbid").Rows(0)("uqx"))If strkind =Trim(TextBox2.Text) ThenTreeView1.Enabled = Truexx = 0For x = 1 To 10000 Step 5If Mid(strqx, x, 4) <> "" Thenstrqx2(xx) = Mid(strqx, x, 4)xx = xx + 1ElseExit ForEnd IfNextElseMsgBox("Password is wrong!")End If'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TreeView1.Nodes.Clear()Dim deptmp(100)If mycon.State = ConnectionState.Closed Then mycon.Open()Dim mcomm As New SqlCommand("select distinct dep from RPTpath", mycon)Dim myrm As SqlDataReader = mcomm.ExecuteReaderDim k As Integer = 0While myrm.Readdeptmp(k) = Trim(myrm(0))k = k + 1End Whilemyrm.Close()Dim h As Integer = 0Dim y As Integer = 0For h = 0 To k - 1 '部门数量TreeView1.Nodes.Add(Trim(deptmp(h)))' For y = 0 To y = xx - 1 '报表权限数量dc=New SqlDataAdapter("select * from RPTpath where dep='"&Trim(deptmp(h))&"' ", mycon)dc.Fill(dbase, "tbid1")If (dbase.Tables("tbid1").Rows.Count > 0) ThenDim i As IntegerFor i = 0 To dbase.Tables("tbid1").Rows.Count - 1For y = 0 To xx - 1If Trim(dbase.Tables("tbid1").Rows(i)("rptid")) = strqx2(y) Then TreeView1.Nodes(h).Nodes.Add(Trim(dbase.Tables("tbid1").Rows(i)("rptname"))) End IfNextNextEnd Ifdbase.Clear()NextMenuStrip1.TabIndex = 0TreeView1.TabIndex = 9End SubEnd Class'*****************************************************************'*crystal report 的使用示例'*适用版本:9.0'*情况:此为在水晶报表软件中制作报表(rpt文件)的调用方式'*菜单->工程->引用->选择:'*1、Crystal Reports 9 ActiveX Desioner Desion and Runtime Library'*2、Crystal Reports 9 activeX Desioner Run Time Library'*好多朋友有这个问题:报表显示后数据没有刷新,解决方法如下:'*1、在报表的设计界面,菜单“文件”--“选项”-“建立报表”选项卡--把“将数据与报表一起保存”前的勾去掉即可'*2、调用报表对象的DiscardSavedData方法'*****************************************************************Option ExplicitDim Report As New CrystalReport1Dim wjfilesys As FileSystemObject 'FSO 对象,用于文件操作Dim WithEvents CrSecRH As Section '报表显示区对象Dim capp As New CRAXDDRT.Application '报表集合对象Dim carp As New CRAXDRT.Report '报表集合中的报表对象Dim carsubp As New CRAXDRT.Report '报表集合对象中的子报表对象Dim Pic2 As OLEObject '报表对象中的Ole对象Dim mytxt As CRAXDRT.TextObject '报表对象中的Textbox对象Private Sub Combo1_Change() '放大(缩小)比例CRViewer91.Zoom (CInt(Combo1.Text))End SubPrivate Sub Command1_Click() '显示第一页CRViewer91.ShowFirstPageEnd SubPrivate Sub Command10_Click() '打印报表CRViewer91.PrintReportEnd SubPrivate Sub Command11_Click()CRViewer91.showclosebuttonEnd SubPrivate Sub Command2_Click() '刷新报表CRViewer91.RefreshEnd SubPrivate Sub Command3_Click() '显示上一页CRViewer91.ShowPreviousPageEnd SubPrivate Sub Command4_Click() '显示下一页CRViewer91.ShowNextPageEnd SubPrivate Sub Command5_Click() '显示最后一页CRViewer91.ShowLastPageEnd SubPrivate Sub Command6_Click() '在报表内容内搜索If (txtSearch.Text <> "") ThenCRViewer91.SearchForText (txtSearch.Text)End IftxtSearch.Text = ""End SubPrivate Sub Command7_Click() '导入出PDFDim myExportFile As StringmyExportFile = App.Path + "\temp.pdf"If wjfilesys.FileExists(myExportFile) Thenwjfilesys.DeleteFile (myExportFile)End IfReport.ExportOptions.DiskFileName = myExportFileReport.ExportOptions.FormatType = crEFT PortableDocFormat Report.ExportOptions.DestinationType = crEDTDiskFileReport.ExportOptions.PDFExportAllPages = TrueReport.Export (False)End SubPrivate Sub Command8_Click() '导出到ExcelDim myExportFile As StringmyExportFile = App.Path + "\temp.xls"If wjfilesys.FileExists(myExportFile) Thenwjfilesys.DeleteFile (myExportFile)End IfReport.ExportOptions.DiskFileName = myExportFileReport.ExportOptions.FormatType = crEFT Excel97Report.ExportOptions.DestinationType = crEDTDiskFileReport.ExportOptions.PDFExportAllPages = TrueReport.Export (False)End SubPrivate Sub Command9_Click() '导出到WORDDim myExportFile As StringmyExportFile = App.Path + "\temp.doc"If wjfilesys.FileExists(myExportFile) Thenwjfilesys.DeleteFile (myExportFile)End IfReport.ExportOptions.DiskFileName = myExportFileReport.ExportOptions.FormatType = crEFT WordForWindowsReport.ExportOptions.DestinationType = crEDTDiskFileReport.ExportOptions.PDFExportAllPages = TrueReport.Export (False)End SubPrivate Sub Form_Load()Screen.MousePointer = vbHourglassDim cn As New ADODB.ConnectionDim rs As New ADODB.RecordsetDim strsql As StringDim i As IntegerIf cn.State = adStateOpen Then cn.Close'SQL SERVER连接方式With cn.Provider = "sqloledb".ConnectionString = "data source=dd;initial catalog=dfd;user id=sa;password=aaa".OpenEnd With'Mdb的连接方式With cn.Provider = "Microsoft.Jet.OLEDB.4.0".ConnectionString = "Data Source=" + App.Path + "\Test.mdb;Persist Security Info=False" .OpenEnd Withstrsql = "select * from carsort"If rs.State = adStateOpen Then rs.CloseWith rs.ActiveConnection = cn.CursorLocation = adUseClient.Open strsql, cn, adOpenDynamic, adLockOptimisticEnd WithSet carp = capp.OpenReport(App.Path + "\CryStalTest.rpt") '取报表对象Set carsubp = carp.OpenSubreport("myhgyp") '取子报表对象Set CrSecRH = carp.Sections("PageHeaderSection1") '取报表头显示区对象Set Pic2 = carp.Sections("PageHeaderSection1").ReportObjects("picture1")'取报表头显示区中的Ole对象Set mytxt = CrSecRH.ReportObjects("mytxt")For i = 1 To carp.Database.Tables.Count '设置报表的数据源If carp.Database.Tables.Item(i).Name = "carsort" Thencarp.Database.Tables(i).SetDataSource rsEnd IfNextFor i = 1 To carsubp.Database.Tables.Count '设置子报表的数据源If carp.Database.Tables.Item(i).Name = "carsort" Thencarsubp.Database.Tables(i).SetDataSource rsEnd IfNextScreen.MousePointer = vbHourglass'第一种设置参数的方式(carp报表集合对象)carp.ParameterFields(1).ClearCurrentValueAndRangecarp.ParameterFields(1).AddCurrentValue ("myhgyp")carp.ParameterFields(2).ClearCurrentValueAndRangecarp.ParameterFields(2).AddCurrentValue (CInt("3"))'第二种设置参数的方式(carp报表集合对象)carp.ParameterFields.GetItemByName("gg").ClearCurrentValueAndRangecarp.ParameterFields.GetItemByName("gg").AddCurrentValue ("myh11" & vbCrLf & "-2gyp") carp.ParameterFields.GetItemByName("ff").ClearCurrentValueAndRangecarp.ParameterFields.GetItemByName("ff").AddCurrentValue (CInt("673"))carp.DiscardSavedDataCRViewer91.ReportSource = carpCRViewer91.ViewReportScreen.MousePointer = vbDefaultCRViewer91.Zoom 100'----------------------Screen.MousePointer = vbDefaultSet wjfilesys = CreateObject("Scripting.FileSystemObject")End SubPrivate Sub CrSecRH_Format(ByVal pFormattingInfo As Object)'格式化报表头显示区中的对象Set Pic2.FormattedPicture = LoadPicture(App.Path & "\tsconfig.bmp") 'changes the pic in the Report Headermytxt.SetText Format(mytxt.Text, "####年##月##日") '格式化TextBox中的文本显示方式End SubPrivate Sub Form_Resize() '设置报表显示区域CRViewer91.Top = 0CRViewer91.Left = 0CRViewer91.Height = ScaleHeightCRViewer91.Width = ScaleWidthEnd Sub###一、在使用自带的水晶报表时,请注册,否则只能使用30次二、使用CrystalReportViewer进行预览,CrystalReportViewer控件允许在应用程序中查看Crystal ReportReportSource属性用于设置要查看哪个报表。
目前的商业工具如水晶报表,ActiveReport等,都提供了灵活,强大的功能,但是对于比较特殊化的表格,特别是国内的一些应用,都是一个个的格子组成的,这样要是用线来一根根画就比较麻烦,但是这类工具还都不提供表格化的报表布局定义方式。
一个很好的选择是VS2005的客户端报表(RDLC),但是在某几个方面还是不够灵活,例如,灵活性有限制,要想自己编码实现一些复杂逻辑还是有困难;要VS2005,对于一些还在使用VS2003的项目就只有眼馋的份了。
用Excel来实现,优点在于页面布局设计灵活,同时使用代码来操作数据要更灵活,更精确。
下面是一个简单的例子,打开一个定义好的Excel文件,这个文件是作为报表的模板,然后向模板的指定格子里填充数据,形成一个报表,在web方式下可以按照指定的命名方式在服务器上生成一个excel 文件,之后传送到客户端,由客户端启动excel进行打印。
Excel.Application m_objExcel = null;Excel._Workbook m_objBook = null;Excel.Sheets m_objSheets = null;Excel._Worksheet m_objSheet = null;Excel.Range m_objRange = null;object m_objOpt = System.Reflection.Missing.Value;try{m_objExcel = new Excel.Application();m_objBook = m_objExcel.Workbooks.Open("z:\\Book1.xls", m_objOpt,m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);m_objSheets = (Excel.Sheets)m_objBook.Worksheets;m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));string[] info = new string[5] { "Cure", "26", "", "汉", "按时 ?放奥斯丁奥斯丁非是否奥斯丁非" };m_objRange = m_objSheet.get_Range("B1", m_objOpt);m_objRange.Value = info[0];m_objRange = m_objSheet.get_Range("E1", m_objOpt);m_objRange.Value = info[1];m_objRange = m_objSheet.get_Range("B2", m_objOpt);m_objRange.Value = info[2];m_objRange = m_objSheet.get_Range("E2", m_objOpt);m_objRange.Value = info[3];m_objRange = m_objSheet.get_Range("A3", m_objOpt);m_objRange.Value = info[4];m_objExcel.DisplayAlerts = false;m_objBook.SaveAs("z:\\Book2.xls", m_objOpt, m_objOpt,m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,m_objOpt, m_objOpt, m_objOpt, m_objOpt);}catch (Exception ex){MessageBox.Show(ex.Message);}finally{m_objBook.Close(m_objOpt, m_objOpt, m_objOpt);m_objExcel.Workbooks.Close();m_objExcel.Quit();System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook);System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);m_objBook = null;m_objExcel = null;GC.Collect();}可以看到,使用Excel要进行一部分的编码,好在这部分还不太复杂,但是最大的问题就在于当报表需求变更时,要重新编译部署,而且当格子特别多的时候,要这样硬编码还是挺痛苦的一件事。