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[
0].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[
0].Rows[
0][
"
ReportName
"].ToString() +
"
" + ds.Tables[
0].Rows[
0][
"
ReportDescription
"].ToString();
50
for (
int i =
0; i < ds.Tables[
0].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;
100 exportOpts.DestinationOptions = diskOpts;
101
try
102 {
103 oRpt.Export();
104 MessageBox.Show(
"
导出excel成功!
" + diskOpts.DiskFileName,
"
成功提示
", MessageBoxButtons.OK, MessageBoxIcon.Information);
105
106 }
107
catch (System.Exception err)
108 {
109 MessageBox.Show(err.Message,
"
错误提示:导出excel失败
", MessageBoxButtons.OK, MessageBoxIcon.Error);
110 }
111 }
112 }
113
//
核心
114
private
void ReplaceExportButton()
115 {
116
//
遍历crystalReportViewer1控件里的控件
117
foreach (
object ctl
in crystalReportViewer1.Controls)
118 {
119
//
取得控件名称
120
string sControl = ctl.GetType().Name.ToString().ToLower();
121
//
取得工具条
122
if (sControl ==
"
toolstrip
")
123 {
124 ToolStrip tab1 = (ToolStrip)ctl;
125
//
遍历工具条Item
126
for (
int i =
0; i <= tab1.Items.Count -
1; i++)
127 {
128
//
MessageBox.Show(tab1.Items[i].ToolTipText);
129
//
如果是导出按钮
130
if (tab1.Items[i].ToolTipText ==
"
导出报表
" || tab1.Items[i].ToolTipText ==
"
Export Report
")
131 {
132
//
先创建一个ToolStripButton准备替代现有Button
133
ToolStripButton tbutton =
new ToolStripButton();
134
//
获取原导出按钮的按钮图片
135
Image img1 = tab1.Items[i].Image;
136
//
移除原导出按钮
137
//
tab1.Items.Remove(tab1.Items[i]);
138
//
设置新button属性
139
tbutton.Image = img1;
140 tbutton.ToolTipText =
"
自定义导出Execl报表按钮
";
141
//
在原位置上插入新Button
142
tab1.Items.Insert(
12,tbutton);
143
144
//
绑定自定义事件
145
tbutton.Click +=
new System.EventHandler(
this.btnExportExcel_Click);
146
break;
147 }
148
149 }
150 }
151
152 }
153 }
154
155
156 }
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;
10 }
11
12
private
void ShowRPT2_Load(
object sender, EventArgs e)
13 {
14 ShowForm form1 = System.Windows.Forms.Application.OpenForms[
"
ShowForm
"]
as ShowForm;
15 TableLogOnInfo logOnInfo =
new TableLogOnInfo();
16 CRAXDDRT.ParameterValues crPara =
new CRAXDDRT.ParameterValues();
17
string strg = pParentWin.ReportPath +
"
\\
" + pParentWin.ReportName;
18 System.Windows.Forms.Application.UseWaitCursor =
true;
19 ApplicationClass applicationClass =
new ApplicationClass();
20 CRAXDDRT.Report report =
new CRAXDDRT.Report();
21
22
try
23 {
24 report = applicationClass.OpenReport(strg,
null);
25 FileState =
"
YES
";
26 }
27
catch (System.Exception err)
28 {
29 FileState =
"
NO
";
30 MessageBox.Show(err.Message,
"
错误提示:读取报表文件错误
", MessageBoxButtons.OK, MessageBoxIcon.Error);
31
32
//
return;
33
34 }
35
if (FileState ==
"
YES
")
36 {
37 logOnInfo.ConnectionInfo.ServerName = W1.LoadXmlFileValue(
"
config.xml
",
"
Sys
",
"
HostName
");
38 logOnInfo.ConnectionInfo.DatabaseName = W1.LoadXmlFileValue(
"
config.xml
",
"
Sys
",
"
DataBase
");
39 logOnInfo.ConnectionInfo.UserID = W1.Decrypt(W1.LoadXmlFileValue(
"
config.xml
",
"
Sys
",
"
User
"));
40 logOnInfo.ConnectionInfo.Password = W1.Decrypt(W1.LoadXmlFileValue(
"
config.xml
",
"
Sys
",
"
Password
"));
41 report.Database.Tables[
1].SetLogOnInfo(logOnInfo.ConnectionInfo.ServerName, logOnInfo.ConnectionInfo.DatabaseName, logOnInfo.ConnectionInfo.UserID, logOnInfo.ConnectionInfo.Password);
42
//
建立.rpt文件与CryStalReportviewer文件之间的连接
43
//
参数
44
45
try
46 {
47 DataSet ds =
new DataSet();
48
string _strSql =
"
SELECT P.*,RP.* FROM ReportParameter RP,Report P where RP.ReportName=P.ReportName AND P.ReportName='
" + pParentWin.ReportName +
"
' order by RP.ID
";
49 ds = W1.DS(_strSql,
"
Sys
");
50
//
动态修WinForm的Text[Report表中ReportDescription]
51
this.Text =
this.Text + ds.Tables[
0].Rows[
0][
"
ReportName
"].ToString() +
"
" + ds.Tables[
0].Rows[
0][
"
ReportDescription
"].ToString();
52
for (
int i =
0; i < ds.Tables[
0].Rows.Count; i++)
53 {
54 report.ParameterFields.GetItemByName(ds.Tables[
0].Rows[i][
"
ParaName
"].ToString(),
null).ClearCurrentValueAndRange();
55 report.ParameterFields.GetItemByName(ds.Tables[
0].Rows[i][
"
ParaName
"].ToString(),
null).AddCurrentValue(form1.str[i]);
56
//
report.ParameterFields[i].AddCurrentValue(form1.str[i]);
57
58 }
59 }
60
catch (System.Exception err)
61 {
62 FileState =
"
NO
";
63 MessageBox.Show(err.Message,
"
错误提示:读取报表参数错误
", MessageBoxButtons.OK, MessageBoxIcon.Error);
64
//
return;
65
66 }
67
68
69 }
70 axCrystalActiveXReportViewer1.ReportSource = report;
71 axCrystalActiveXReportViewer1.ViewReport();
72 System.Windows.Forms.Application.UseWaitCursor =
false;
73 }
74
75
76
77
78 }