水晶报表Pull模式的两种方法和Push模式的实现
水晶报表Pull模式的两种方法和Push模式的实现
Pull模式:
//生成报表的方法
private void GenerateReport()
{
/*************************************************************************
* CrystalReport(Pull Mode First)
* ***********************************************************************/
ReportDocument objReportDocument = new ReportDocument();
//获取数据库信息
TableLogOnInfo objTLOI = new TableLogOnInfo();
objTLOI.ConnectionInfo.ServerName = "cfox";
objTLOI.ConnectionInfo.UserID = "sa";
objTLOI.ConnectionInfo.Password = "sa";
objTLOI.ConnectionInfo.DatabaseName = "ETMS";
//为水晶报表绑定数据库
string filePath = Server.MapPath("..\\Reports\\PullModeTest.rpt");
objReportDocument.Load(filePath);
objReportDocument.Database.Tables[0].ApplyLogOnInfo(objTLOI);
//给水晶报表传参数
objReportDocument.SetParameterValue("OrderID",orderID);
//给控件绑定数据源
this.crPullModeTest.ReportSource = objReportDocument;
this.crPullModeTest.DataBind();
//导出文件
ExportOptions crExportOption = new ExportOptions();
DiskFileDestinationOptions crDiskFileDestOption = new DiskFileDestinationOptions();
crDiskFileDestOption.DiskFileName = Server.MapPath("..\\TempReports\\" + "PullModeTest.pdf");
crExportOption = objReportDocument.ExportOptions;
crExportOption.DestinationOptions = crDiskFileDestOption;
crExportOption.ExportDestinationType = ExportDestinationType.DiskFile;
crExportOption.ExportFormatType = ExportFormatType.PortableDocFormat;
objReportDocument.Export();
FileInfo file = null;
string filename = null;
filename = Server.MapPath("..\\TempReports\\" + "PullModeTest.pdf");
file = new FileInfo(filename);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + "PullModeTest.pdf");
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(filename);
Response.Flush();
System.IO.File.Delete(filename);
Response.End();
/***************************************************************************
* CrystalReport(Pull Mode Second)
* 注意:此种模式下才使用下面的"InitialCode"
* **************************************************************************/
//实例化报表
Report = new PullModeTest();
//给报表传参数
ParameterValues OrderID = new ParameterValues();
AddDiscreteValue(OrderID, orderID);
Report.DataDefinition.ParameterFields["OrderID"].ApplyCurrentValues(OrderID);
try
{
string filename = "PullModeTest.pdf";
Export(filename, ExportFormatType.PortableDocFormat);
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
}
#region InitialCode
//获取水晶报表名字
protected ReportClass Report
{
get { return rpt; }
set { rpt = value; }
}
protected void LogOnReport()
{
LogOnReport(ServerName, DatabaseName, UserID, UserPassword);
}
protected void LogOnReport(string serverName, string databaseName, string uid, string pwd)
{
//连接数据库
ConnectionInfo crConnInfo = new ConnectionInfo();
crConnInfo.ServerName = serverName;
crConnInfo.DatabaseName = databaseName;
crConnInfo.UserID = uid;
crConnInfo.Password = pwd;
foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in rpt.Database.Tables)
{
// Apply the connection info for each table in the report
TableLogOnInfo crTableLogonInfo = crTable.LogOnInfo;
crTableLogonInfo.ConnectionInfo = crConnInfo;
crTable.ApplyLogOnInfo(crTableLogonInfo);
// Check if the table source is database or DataSet
// NOTE: Do not set location of table if source is DataSet
if (crTable.Location != "")
{
// Removing qualifying prefixes will assume the database and owner info from your connection in the report.
crTable.Location = crTable.Location.Substring(crTable.Location.LastIndexOf(".") + 1);
}
}
logon = true;
}
protected void Export(string filename)
{
Export(filename, DefaultFormatType);
}
protected void Export(string filename, ExportFormatType formatType)
{
lock (CrystalReportLock)
{
// Apply logon info to report tables
if (!logon)
{
LogOnReport();
}
/************************************************************************
* Export report to stream
*************************************************************************/
// Stream exportStream = rpt.ExportToStream(formatType);
// byte[] buffer = new byte[exportStream.Length];
// int offset = 0;
// // NOTE: This is to handle export of content greater than 2GB which is max int
// int count = (int) Math.Min(exportStream.Length, (long) Int32.MaxValue);
// while (offset < exportStream.Length)
// {
// offset += exportStream.Read(buffer, offset, count);
// }
// exportStream.Close();
// Response.ClearContent();
// Response.ClearHeaders();
// Response.AppendHeader("Content-Disposition", String.Format("download;filename=\"{0}\"", filename));
// Response.ContentType = GetExportContentType(formatType);
// Response.BinaryWrite(buffer);
// Response.Flush();
// Response.Close();
// Response.End();
/**************************************************************************
* Export report to disk
**************************************************************************/
string fileName = Server.MapPath("..\\TempReports\\" + filename);
rpt.ExportToDisk(formatType, fileName);
FileInfo file = new FileInfo(fileName);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(fileName);
Response.Flush();
File.Delete(fileName);
Response.End();
}
}
protected ParameterDiscreteValue AddDiscreteValue(ParameterValues values, object val)
{
ParameterDiscreteValue dValue = new ParameterDiscreteValue();
dValue.Value = val;
values.Add(dValue);
return dValue;
}
// protected void AddDiscreteValue(ParameterValues values, IList vals)
// {
// foreach (object val in vals)
// {
// ParameterDiscreteValue dValue = new ParameterDiscreteValue();
// dValue.Value = val;
// values.Add(dValue);
// }
// }
//
// protected ParameterRangeValue AddRangeValue(ParameterValues values, object startVal, object endVal)
// {
// ParameterRangeValue rValue = new ParameterRangeValue();
// rValue.StartValue = startVal;
// rValue.EndValue = endVal;
// values.Add(rValue);
// return rValue;
// }
private string GetExportContentType(ExportFormatType formatType)
{
string contentType;
switch (formatType)
{
case ExportFormatType.HTML32:
contentType = "application/html";
break;
case ExportFormatType.HTML40:
contentType = "application/html";
break;
case ExportFormatType.Excel:
contentType = "application/vnd.ms-xls";
break;
case ExportFormatType.WordForWindows:
contentType = "application/msword";
break;
case ExportFormatType.RichText:
contentType = "application/rtf";
break;
case ExportFormatType.PortableDocFormat:
contentType = "application/pdf";
break;
default:
contentType = "application/html";
break;
}
return contentType;
}
#endregion
private void GenerateReport()
{
/*************************************************************************
* CrystalReport(Pull Mode First)
* ***********************************************************************/
ReportDocument objReportDocument = new ReportDocument();
//获取数据库信息
TableLogOnInfo objTLOI = new TableLogOnInfo();
objTLOI.ConnectionInfo.ServerName = "cfox";
objTLOI.ConnectionInfo.UserID = "sa";
objTLOI.ConnectionInfo.Password = "sa";
objTLOI.ConnectionInfo.DatabaseName = "ETMS";
//为水晶报表绑定数据库
string filePath = Server.MapPath("..\\Reports\\PullModeTest.rpt");
objReportDocument.Load(filePath);
objReportDocument.Database.Tables[0].ApplyLogOnInfo(objTLOI);
//给水晶报表传参数
objReportDocument.SetParameterValue("OrderID",orderID);
//给控件绑定数据源
this.crPullModeTest.ReportSource = objReportDocument;
this.crPullModeTest.DataBind();
//导出文件
ExportOptions crExportOption = new ExportOptions();
DiskFileDestinationOptions crDiskFileDestOption = new DiskFileDestinationOptions();
crDiskFileDestOption.DiskFileName = Server.MapPath("..\\TempReports\\" + "PullModeTest.pdf");
crExportOption = objReportDocument.ExportOptions;
crExportOption.DestinationOptions = crDiskFileDestOption;
crExportOption.ExportDestinationType = ExportDestinationType.DiskFile;
crExportOption.ExportFormatType = ExportFormatType.PortableDocFormat;
objReportDocument.Export();
FileInfo file = null;
string filename = null;
filename = Server.MapPath("..\\TempReports\\" + "PullModeTest.pdf");
file = new FileInfo(filename);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + "PullModeTest.pdf");
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(filename);
Response.Flush();
System.IO.File.Delete(filename);
Response.End();
/***************************************************************************
* CrystalReport(Pull Mode Second)
* 注意:此种模式下才使用下面的"InitialCode"
* **************************************************************************/
//实例化报表
Report = new PullModeTest();
//给报表传参数
ParameterValues OrderID = new ParameterValues();
AddDiscreteValue(OrderID, orderID);
Report.DataDefinition.ParameterFields["OrderID"].ApplyCurrentValues(OrderID);
try
{
string filename = "PullModeTest.pdf";
Export(filename, ExportFormatType.PortableDocFormat);
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
}
#region InitialCode
//获取水晶报表名字
protected ReportClass Report
{
get { return rpt; }
set { rpt = value; }
}
protected void LogOnReport()
{
LogOnReport(ServerName, DatabaseName, UserID, UserPassword);
}
protected void LogOnReport(string serverName, string databaseName, string uid, string pwd)
{
//连接数据库
ConnectionInfo crConnInfo = new ConnectionInfo();
crConnInfo.ServerName = serverName;
crConnInfo.DatabaseName = databaseName;
crConnInfo.UserID = uid;
crConnInfo.Password = pwd;
foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in rpt.Database.Tables)
{
// Apply the connection info for each table in the report
TableLogOnInfo crTableLogonInfo = crTable.LogOnInfo;
crTableLogonInfo.ConnectionInfo = crConnInfo;
crTable.ApplyLogOnInfo(crTableLogonInfo);
// Check if the table source is database or DataSet
// NOTE: Do not set location of table if source is DataSet
if (crTable.Location != "")
{
// Removing qualifying prefixes will assume the database and owner info from your connection in the report.
crTable.Location = crTable.Location.Substring(crTable.Location.LastIndexOf(".") + 1);
}
}
logon = true;
}
protected void Export(string filename)
{
Export(filename, DefaultFormatType);
}
protected void Export(string filename, ExportFormatType formatType)
{
lock (CrystalReportLock)
{
// Apply logon info to report tables
if (!logon)
{
LogOnReport();
}
/************************************************************************
* Export report to stream
*************************************************************************/
// Stream exportStream = rpt.ExportToStream(formatType);
// byte[] buffer = new byte[exportStream.Length];
// int offset = 0;
// // NOTE: This is to handle export of content greater than 2GB which is max int
// int count = (int) Math.Min(exportStream.Length, (long) Int32.MaxValue);
// while (offset < exportStream.Length)
// {
// offset += exportStream.Read(buffer, offset, count);
// }
// exportStream.Close();
// Response.ClearContent();
// Response.ClearHeaders();
// Response.AppendHeader("Content-Disposition", String.Format("download;filename=\"{0}\"", filename));
// Response.ContentType = GetExportContentType(formatType);
// Response.BinaryWrite(buffer);
// Response.Flush();
// Response.Close();
// Response.End();
/**************************************************************************
* Export report to disk
**************************************************************************/
string fileName = Server.MapPath("..\\TempReports\\" + filename);
rpt.ExportToDisk(formatType, fileName);
FileInfo file = new FileInfo(fileName);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(fileName);
Response.Flush();
File.Delete(fileName);
Response.End();
}
}
protected ParameterDiscreteValue AddDiscreteValue(ParameterValues values, object val)
{
ParameterDiscreteValue dValue = new ParameterDiscreteValue();
dValue.Value = val;
values.Add(dValue);
return dValue;
}
// protected void AddDiscreteValue(ParameterValues values, IList vals)
// {
// foreach (object val in vals)
// {
// ParameterDiscreteValue dValue = new ParameterDiscreteValue();
// dValue.Value = val;
// values.Add(dValue);
// }
// }
//
// protected ParameterRangeValue AddRangeValue(ParameterValues values, object startVal, object endVal)
// {
// ParameterRangeValue rValue = new ParameterRangeValue();
// rValue.StartValue = startVal;
// rValue.EndValue = endVal;
// values.Add(rValue);
// return rValue;
// }
private string GetExportContentType(ExportFormatType formatType)
{
string contentType;
switch (formatType)
{
case ExportFormatType.HTML32:
contentType = "application/html";
break;
case ExportFormatType.HTML40:
contentType = "application/html";
break;
case ExportFormatType.Excel:
contentType = "application/vnd.ms-xls";
break;
case ExportFormatType.WordForWindows:
contentType = "application/msword";
break;
case ExportFormatType.RichText:
contentType = "application/rtf";
break;
case ExportFormatType.PortableDocFormat:
contentType = "application/pdf";
break;
default:
contentType = "application/html";
break;
}
return contentType;
}
#endregion
Push模式:
private void GenerateReport()
{
/********************************************************************************
* CrystalReport(Push Mode)
* 注意:使用水晶报表的Push模式,只能先建立一个DataSet.xsd文件,然后在其中建立一个新的
* element元素,然后连接数据库,把要用到的表放到DataSet.xsd文件中,看都用到了哪些字段,
* 然后把用到的字段都放到新建立的element中,然后删除那些从数据库中拖过来的表,然后点击
* 右键生成数据集,并且在程序中从数据库中取得的数据集的表的名称应该命名成与element表的
* 名称相同,这样就可以了。
* ***********************************************************************************/
string fileName = Server.MapPath("..\\Reports\\PushModeTest.rpt");
ReportDocument objReportDocument = new ReportDocument();
objReportDocument.Load(fileName);
DataSet ds = new DataSet("OrderAndOrderDetails");
ds = objMyTest.GetOrderDetailsByOrderID(10248);
if(ds.Tables[0].Rows.Count > 0)
{
objReportDocument.SetDataSource(ds);
}
else
{
return;
}
//给水晶报表绑定数据源
this.crPushMode.ReportSource = objReportDocument;
this.crPushMode.DataBind();
//导出设置
string newFileName = Server.MapPath("..\\TempReports\\PushModeTest.pdf");
ExportOptions objExportOption = new ExportOptions();
DiskFileDestinationOptions objDiskFileOption = new DiskFileDestinationOptions();
objDiskFileOption.DiskFileName = newFileName;
objExportOption = objReportDocument.ExportOptions;
objExportOption.DestinationOptions = objDiskFileOption;
objExportOption.ExportDestinationType = ExportDestinationType.DiskFile;
objExportOption.ExportFormatType = ExportFormatType.PortableDocFormat;
objReportDocument.Export();
//导出PDF文件
FileInfo objFileInfo = new FileInfo(newFileName);
Response.Clear();
Response.AddHeader("Content-Disposition","GenerateFileName:FileName = PushModeTest.pdf");
Response.AddHeader("Content-Length",objFileInfo.Length.ToString());
Response.ContentType = "Application/pdf";
Response.WriteFile(newFileName);
Response.Flush();
File.Delete(newFileName);
Response.End();
}
{
/********************************************************************************
* CrystalReport(Push Mode)
* 注意:使用水晶报表的Push模式,只能先建立一个DataSet.xsd文件,然后在其中建立一个新的
* element元素,然后连接数据库,把要用到的表放到DataSet.xsd文件中,看都用到了哪些字段,
* 然后把用到的字段都放到新建立的element中,然后删除那些从数据库中拖过来的表,然后点击
* 右键生成数据集,并且在程序中从数据库中取得的数据集的表的名称应该命名成与element表的
* 名称相同,这样就可以了。
* ***********************************************************************************/
string fileName = Server.MapPath("..\\Reports\\PushModeTest.rpt");
ReportDocument objReportDocument = new ReportDocument();
objReportDocument.Load(fileName);
DataSet ds = new DataSet("OrderAndOrderDetails");
ds = objMyTest.GetOrderDetailsByOrderID(10248);
if(ds.Tables[0].Rows.Count > 0)
{
objReportDocument.SetDataSource(ds);
}
else
{
return;
}
//给水晶报表绑定数据源
this.crPushMode.ReportSource = objReportDocument;
this.crPushMode.DataBind();
//导出设置
string newFileName = Server.MapPath("..\\TempReports\\PushModeTest.pdf");
ExportOptions objExportOption = new ExportOptions();
DiskFileDestinationOptions objDiskFileOption = new DiskFileDestinationOptions();
objDiskFileOption.DiskFileName = newFileName;
objExportOption = objReportDocument.ExportOptions;
objExportOption.DestinationOptions = objDiskFileOption;
objExportOption.ExportDestinationType = ExportDestinationType.DiskFile;
objExportOption.ExportFormatType = ExportFormatType.PortableDocFormat;
objReportDocument.Export();
//导出PDF文件
FileInfo objFileInfo = new FileInfo(newFileName);
Response.Clear();
Response.AddHeader("Content-Disposition","GenerateFileName:FileName = PushModeTest.pdf");
Response.AddHeader("Content-Length",objFileInfo.Length.ToString());
Response.ContentType = "Application/pdf";
Response.WriteFile(newFileName);
Response.Flush();
File.Delete(newFileName);
Response.End();
}
转自 http://www.cnblogs.com/tel1982/archive/2008/07/28/1254819.html
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网