Crystal Report在.net中的两种显示方式

编写人:CC阿爸

2014-7-29

近来在完成深圳一公司的项目,对方对各方面要求相当严格,一不满意就拒绝签收,为了对修正水晶报表显示及导出的一些小问题,无赖之下,仔细了解一下水晶报表的操作方法,逼苦我们这些苦逼的程序,虽说在以前的项目中,也常使用crystal report 来制作报表。并且针对web与winform 都各有不同的地方。

但总的来讲:显示水晶报表目前使用控件对象的有两种显示方式

1.      使用crystalReportViewer1 来显示报表

2.      使用Crystal ActiveX report viewer 来显示报表

在使用前,先废话一下有关水晶报表的一些版本的问题:

1.      我接触的第一个是7.0的版本。有一些vb程序的程序都在使用这个版本的报表

2.      后来使用上.net开发工具后,直接升到了crystal report 9.0。

3.      Vs 2008 内置了10.5的水晶报表。但这个版本在官方是没有的。

因此我制作报表时仍使用的是为10.0

4.      后来水晶报表先后推出了11  2008,现到13,14

5.      最后想说的,这中间sap收购了水晶报表,现查找技术文档只能在sap网站上查找了。

接下来。废话就不多讲了,将我们使用的代码贴出来供大家参考,发扬互联网的共享精神。让苦逼的程序猿们也少走点冤枉路了。

开发环境:vs 2008+crystal report 10

使用crystalReportViewer1 来显示报表

  1  public partial class ShowRPT : Form
  2     {
  3         private XOS.Admin.ShowForm pParentWin = null;
  4         protected string FileState = "";
  5         WinBase.Common W1 = new WinBase.Common();
  6          //这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
  7         ReportDocument oRpt = new ReportDocument();
  8         public ShowRPT(XOS.Admin.ShowForm WinMain)
  9         {
 10             InitializeComponent();
 11             pParentWin = WinMain;
 12         }
 13 
 14         private void ShowRPT_Load(object sender, EventArgs e)
 15         {
 16             ShowForm form1 = Application.OpenForms["ShowForm"] as ShowForm;
 17             TableLogOnInfo logOnInfo = new TableLogOnInfo();
 18             ReplaceExportButton();//新增一个工具栏自定义导出excel
 19            
 20             try
 21             {
 22                 string strg = pParentWin.ReportPath + "\\" + pParentWin.ReportName;
 23                 oRpt.Load(strg);
 24                 FileState = "YES";
 25             }
 26             catch (System.Exception err)
 27             {
 28                 FileState = "NO";
 29                 MessageBox.Show(err.Message, "错误提示:读取报表文件错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
 30 
 31                 //return;
 32 
 33             }
 34             if (FileState == "YES")
 35             {
 36                 logOnInfo.ConnectionInfo.ServerName = W1.LoadXmlFileValue("config.xml", "Sys", "HostName");
 37                 logOnInfo.ConnectionInfo.DatabaseName = W1.LoadXmlFileValue("config.xml", "Sys", "DataBase");
 38                 logOnInfo.ConnectionInfo.UserID = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "User"));
 39                 logOnInfo.ConnectionInfo.Password = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "Password"));
 40                 oRpt.Database.Tables[].ApplyLogOnInfo(logOnInfo);
 41                 //建立.rpt文件与CryStalReportviewer文件之间的连接
 42                 //参数
 43                 try
 44                 {
 45                     DataSet ds = new DataSet();
 46                     string _strSql = "SELECT  P.*,RP.* FROM ReportParameter RP,Report P where RP.ReportName=P.ReportName AND P.ReportName='" + pParentWin.ReportName + "' order by RP.ID ";
 47                     ds = W1.DS(_strSql, "Sys");
 48                     //动态修WinForm的Text[Report表中ReportDescription]
 49                     this.Text = this.Text + ds.Tables[].Rows[]["ReportName"].ToString() + " " + ds.Tables[].Rows[]["ReportDescription"].ToString();
 50                     for (int i = ; i < ds.Tables[].Rows.Count; i++)
 51                     {
 52                         oRpt.SetParameterValue(i, form1.str[i]);
 53 
 54                     }
 55                 }
 56                 catch (System.Exception err)
 57                 {
 58                     FileState = "NO";
 59                     MessageBox.Show(err.Message, "错误提示:读取报表参数错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
 60                     //return;
 61 
 62                 }
 63                 ParameterFields parameterFields = crystalReportViewer1.ParameterFieldInfo;
 64                 crystalReportViewer1.ReportSource = oRpt;
 65                 crystalReportViewer1.ShowRefreshButton = false;
 66 
 67             }
 68         }
 69 
 70         private void btnExportExcel_Click(object sender, EventArgs e)
 71         {          
 72 
 73                 // 声明变量并获取导出选项。
 74                 ExportOptions exportOpts = new ExportOptions();
 75                 ExcelFormatOptions excelFormatOpts = new ExcelFormatOptions();
 76                 DiskFileDestinationOptions diskOpts = new DiskFileDestinationOptions();
 77                 exportOpts = oRpt.ExportOptions;
 78                 // 设置 Excel 格式选项。
 79                 excelFormatOpts.ExcelUseConstantColumnWidth = true;
 80                 exportOpts.ExportFormatType = ExportFormatType.Excel;
 81                 exportOpts.FormatOptions = excelFormatOpts;
 82 
 83                 // 设置磁盘文件选项并导出。
 84                 exportOpts.ExportDestinationType = ExportDestinationType.DiskFile;
 85               SaveFileDialog sf = new SaveFileDialog();
 86               string FileName ="";
 87                sf.Filter = "Microsoft Excel(*.xls)|*.xls" ;
 88             // ……
 89 
 90             /* sf.DefaultExt = "rtf";
 91              * 这么设起不了作用,还不知道原因何在
 92              * 所以只好手动调整顺序 */
 93 
 94             //用sf.FilterIndex调整
 95 
 96                if (DialogResult.OK == sf.ShowDialog())
 97                {
 98                    FileName = sf.FileName;
 99                    diskOpts.DiskFileName = FileName;
                    exportOpts.DestinationOptions = diskOpts;
                    try
                    {
                        oRpt.Export();
                        MessageBox.Show("导出excel成功!" + diskOpts.DiskFileName, "成功提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                       
                    }
                    catch (System.Exception err)
                    {
                        MessageBox.Show(err.Message, "错误提示:导出excel失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
             }
         //核心
         private void ReplaceExportButton()
         {
             //遍历crystalReportViewer1控件里的控件
             foreach (object ctl in crystalReportViewer1.Controls)
             {
                 //取得控件名称
                 string sControl = ctl.GetType().Name.ToString().ToLower();
                 //取得工具条
                 if (sControl == "toolstrip")
                 {
                     ToolStrip tab1 = (ToolStrip)ctl;
                     //遍历工具条Item
                     for (int i = ; i <= tab1.Items.Count - ; i++)
                     {
                         //MessageBox.Show(tab1.Items[i].ToolTipText);
                         //如果是导出按钮
                         if (tab1.Items[i].ToolTipText == "导出报表" || tab1.Items[i].ToolTipText == "Export Report")
                         {
                             //先创建一个ToolStripButton准备替代现有Button
                             ToolStripButton tbutton = new ToolStripButton();
                             //获取原导出按钮的按钮图片
                             Image img1 = tab1.Items[i].Image;
                             //移除原导出按钮
                             //tab1.Items.Remove(tab1.Items[i]);
                             //设置新button属性
                             tbutton.Image = img1;
                             tbutton.ToolTipText = "自定义导出Execl报表按钮";
                             //在原位置上插入新Button
                             tab1.Items.Insert(,tbutton);                            
 
                             //绑定自定义事件
                             tbutton.Click += new System.EventHandler(this.btnExportExcel_Click);
                             break;
                         }
 
                     }
                 }
 
             }
         }
 
 
     }

 1 public partial class ShowRPT2 : Form
 2     {
 3         private XOS.Admin.ShowForm pParentWin = null;
 4         protected string FileState = "";
 5         WinBase.Common W1 = new WinBase.Common();      
 6         public ShowRPT2(XOS.Admin.ShowForm WinMain)
 7         {
 8             InitializeComponent();
 9             pParentWin = WinMain;
         }
 
         private void ShowRPT2_Load(object sender, EventArgs e)
         {
             ShowForm form1 = System.Windows.Forms.Application.OpenForms["ShowForm"] as ShowForm;
             TableLogOnInfo logOnInfo = new TableLogOnInfo();
             CRAXDDRT.ParameterValues crPara = new CRAXDDRT.ParameterValues();
             string strg = pParentWin.ReportPath + "\\" + pParentWin.ReportName;
             System.Windows.Forms.Application.UseWaitCursor = true;
             ApplicationClass applicationClass = new ApplicationClass();
             CRAXDDRT.Report report = new  CRAXDDRT.Report();
            
             try
             {
                 report = applicationClass.OpenReport(strg, null);
                 FileState = "YES";
             }
             catch (System.Exception err)
             {
                 FileState = "NO";
                 MessageBox.Show(err.Message, "错误提示:读取报表文件错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
 
                 //return;
 
             }
             if (FileState == "YES")
             {
                 logOnInfo.ConnectionInfo.ServerName = W1.LoadXmlFileValue("config.xml", "Sys", "HostName");
                 logOnInfo.ConnectionInfo.DatabaseName = W1.LoadXmlFileValue("config.xml", "Sys", "DataBase");
                 logOnInfo.ConnectionInfo.UserID = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "User"));
                 logOnInfo.ConnectionInfo.Password = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "Password"));
                 report.Database.Tables[].SetLogOnInfo(logOnInfo.ConnectionInfo.ServerName, logOnInfo.ConnectionInfo.DatabaseName, logOnInfo.ConnectionInfo.UserID, logOnInfo.ConnectionInfo.Password);
                 //建立.rpt文件与CryStalReportviewer文件之间的连接
                 //参数
                
                 try
                 {
                     DataSet ds = new DataSet();
                     string _strSql = "SELECT  P.*,RP.* FROM ReportParameter RP,Report P where RP.ReportName=P.ReportName AND P.ReportName='" + pParentWin.ReportName + "' order by RP.ID ";
                     ds = W1.DS(_strSql, "Sys");
                     //动态修WinForm的Text[Report表中ReportDescription]
                     this.Text = this.Text + ds.Tables[].Rows[]["ReportName"].ToString() + " " + ds.Tables[].Rows[]["ReportDescription"].ToString();
                     for (int i = ; i < ds.Tables[].Rows.Count; i++)
                     {
                         report.ParameterFields.GetItemByName(ds.Tables[].Rows[i]["ParaName"].ToString(), null).ClearCurrentValueAndRange();
                         report.ParameterFields.GetItemByName(ds.Tables[].Rows[i]["ParaName"].ToString(), null).AddCurrentValue(form1.str[i]);
                        // report.ParameterFields[i].AddCurrentValue(form1.str[i]);
 
                     }
                 }
                 catch (System.Exception err)
                 {
                     FileState = "NO";
                     MessageBox.Show(err.Message, "错误提示:读取报表参数错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                     //return;
 
                 }
                
                
             }
             axCrystalActiveXReportViewer1.ReportSource = report;
             axCrystalActiveXReportViewer1.ViewReport();
             System.Windows.Forms.Application.UseWaitCursor = false;
         }
 
   
 
 
     }

Crystal Report在.net中的两种显示方式的更多相关文章

  1. MySQL中的两种临时表

    MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...

  2. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  3. Linux中的两种守护进程stand alone和xinetd

    Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...

  4. validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符

    //校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...

  5. C#中的两种debug方法

    这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下   第一种:需要把调试方法改成debug代码用 #if DEBU ...

  6. eclipse中的两种Jre 及 Jre与Jdk的区别

    分类: ——————————区分eclipse中的两种Jre———————- (Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.如果你的机器上没有安装任何JRE(或者JDK ...

  7. 在netty3.x中存在两种线程:boss线程和worker线程。

    在netty 3.x 中存在两种线程:boss线程和worker线程.

  8. JavaScript中的两种全局对象

    这里总结的东西特别适合先学习c/c++, Java这类标准语言再学JS的童鞋们看,因为JS在程序执行之前就会初始化一个全局对象,这个全局对象到底是什么是跟JS程序运行环境有关的. 根据JavaScri ...

  9. Java中的两种异常类型及其区别?

    Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...

随机推荐

  1. C++学习35 模板中的函数式参数

    C++对模板类的支持比较灵活,模板类的参数中除了可以有类型参数,还可以有普通参数.例如: template<typename T, int N> class Demo{ }; N 是一个普 ...

  2. eclips中增加对jar包的引用

    http://jingyan.baidu.com/article/ca41422fc76c4a1eae99ed9f.html

  3. shell 统计 awk

    time awk '{a[$1]++}END{for(i in a){printf("%d\t%s\n",a[i],i)}}' access.log | sort -nr | he ...

  4. html5—— 应用程序缓存

    使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这 ...

  5. Kung fu

    1. originPeople in Primitive society(原始社会)in order to survive,they have to hunt for food efficiently ...

  6. DFS与BFS

    顾名思义,DFS就是一直在一个方向搜索,当这一方向不可以时退回该点,换下一方向: 而BFS一开始就是向四面八方搜索,把符合条件的点存入队列中,当前一个点都搜索完毕时,再从队列顶中取出点,再向四面八方搜 ...

  7. VS error retrieving information from user datastore

    搭建好VS2005+PB6.0的开发环境后,新建MFC智能设备应用程序工程出错,错误信息如下: error retrieving information from user datastore 很奇怪 ...

  8. C/C++笔试经典程序(二)

    1.下面5个函数哪个能够成功进行两个数的交换? swap1传的是值的副本,在函数体内被修改了形参p.q(实际参数a.b的一个拷贝),p.q的值确实交换了,但是它们是局部变量,不会影响到主函数中的a和b ...

  9. com学习(四)2——用 ATL 写第一个组件(vs2003)

    步骤2.1:建立一个解决方案. 步骤2.2:在 该解决方案中,新建一个 vc++ 的 ATL 项目.示例程序叫 Simple2,并选择DLL方式,见图一.图二. 图一.新建 ATL 项目 图二.选择非 ...

  10. socket学习笔记——实现收发文件(Windows)

    记录下来,供自己学习! server.c #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <stdlib.h ...