Crystal Report在.net中的两种显示方式
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中的两种显示方式的更多相关文章
- MySQL中的两种临时表
MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...
- ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法
ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块 --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...
- Linux中的两种守护进程stand alone和xinetd
Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...
- validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符
//校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...
- C#中的两种debug方法
这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下 第一种:需要把调试方法改成debug代码用 #if DEBU ...
- eclipse中的两种Jre 及 Jre与Jdk的区别
分类: ——————————区分eclipse中的两种Jre———————- (Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.如果你的机器上没有安装任何JRE(或者JDK ...
- 在netty3.x中存在两种线程:boss线程和worker线程。
在netty 3.x 中存在两种线程:boss线程和worker线程.
- JavaScript中的两种全局对象
这里总结的东西特别适合先学习c/c++, Java这类标准语言再学JS的童鞋们看,因为JS在程序执行之前就会初始化一个全局对象,这个全局对象到底是什么是跟JS程序运行环境有关的. 根据JavaScri ...
- Java中的两种异常类型及其区别?
Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...
随机推荐
- 第十章 Vim程序编辑器学习
1.Vim是进阶版的vi,vim不但可以用不同颜色显示文字内容,还能进行诸如shell script,C program等程序编辑功能. 区别:vi是老师的字处理器,不过功能已经很齐全,但还是有可以进 ...
- Java SE 第十讲---面向对象特征之封装2
1.类中的属性又叫做成员变量(member variable),属性用英文表示为property或者attitude 2.对象(Object)又叫做实例(Instance),生成一个对象的过程又叫做类 ...
- struts2的异常
index.jsp <%@ page language="java" import="java.util.*" contentType="tex ...
- Delphi ServerSocket,ClientSocket示例
Delphi ServerSocket,ClientSocket示例 2008-05-09 16:20 Delphi TServerSocket,TClientSocket实现传送文件代码 1.建立两 ...
- 点评App wiki-git标准实践
fetch与pull fetch = pull + merge fetch -p,用于将清理工作同步到本地repository rebase-衍合 merge与rebase是合并的两种方法(上为mer ...
- junit适配器模式应用
适配器模式 定义: 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作: 构成: 目标抽象角色(Target):定义客户要用的特定领 ...
- Android2.2 API中文文档——View
概述 java.lang.Object ↳ android.view.View 已知直接子类: AnalogClock, ImageView, KeyboardView, Progres ...
- 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(三)
看了上一章的内容,想必较为简单的case也都会编写了吧,但是是不是觉得,如果能够实现用例参数化,是不是会节省很多劳动力,这节就来学下RF中的user keywords,会让你发现写用例原来可以这么简单 ...
- C程序之修改Windows的控制台颜色(转载)
Windows的CMD可以和Linux下的终端一样可以有五颜六色,目前我在网上找到2种方法可以修改Windows的CMD,当然都是在代码中修改的.在“CMD”->“属性”->“颜色”,这种 ...
- EXT学习之——Extjs 文本框 TextField 添加点击(onclick)事件方法
{ xtype:'textfield', listeners: { render: function(p) { // Append the Panel to the click handler's a ...