今天搞了一天水晶报表,真是郁闷啊!
.net中的CrystalReportViewer自带了一个export的功能,可是不知为什么只要放到iframe里面就只能导出一次,连续导第二次的时候就会报错,没办法就只好自己写了一个导出页面,主要的导出和保存方法如下:
/// <summary>
/// Function : 导出报表文件为其他文件格式
/// </summary>
/// <param name="ReportFile">报表文件名称</param>
/// <param name="ReportDataSource">报表文件所使用的数据源Dataset</param>
/// <param name="FileName">要导成的目标文件名称</param>
/// <param name="FileType">要导成的目标文件类型</param>
/// <returns>bool成功返回true,失败返回false</returns>
public bool DoExport(string ReportFile,object ReportDataSource,string FileName,string FileType)
{
try
{
ReportDoc.Load(ReportFile);
ReportDoc.SetDataSource(ReportDataSource);
FileOPS.DiskFileName=FileName;
ExOPS=ReportDoc.ExportOptions;
ExOPS.DestinationOptions=FileOPS;
ExOPS.ExportDestinationType=CrystalDecisions.Shared.ExportDestinationType.DiskFile;
switch (FileType)
{
case "CrystalReports":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.CrystalReport;
break;
case "PDF":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.PortableDocFormat;
break;
case "MSWord":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.WordForWindows;
break;
case "MSExcel":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.Excel;
break;
case "RecordToMSExcel":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.ExcelRecord;
break;
case "RTF":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.RichText;
break;
}
ReportDoc.Export();
return true;
}
catch(Exception ex)
{
Funlib.ShowMessage(ex.Message.ToString().Trim(),this);
return false;
}
}
/// <summary>
/// Function : 保存文件
/// </summary>
/// <param name="ReportFile">报表文件名称</param>
/// <param name="ReportDataSource">数据源Dataset</param>
/// <param name="page">当前页面</param>
/// <param name="FileType">文件类型</param>
public void SaveFile(string ReportFile,object ReportDataSource,System.Web.UI.Page page,string FileType)
{
try
{
int temp;
temp=System.Convert.ToInt32(System.DateTime.Now.Millisecond.ToString());
System.Random ra=new System.Random(temp);
int TmpNumber=ra.Next();
string ftype = "";
switch (FileType)
{
case "CrystalReports":
ftype = "rpt";
break;
case "PDF":
ftype = "pdf";
break;
case "MSWord":
ftype = "doc";
break;
case "MSExcel":
case "RecordToMSExcel":
ftype = "xls";
break;
case "RTF":
ftype = "rtf";
break;
}
string TmpFileName="c:\\"+System.Convert.ToString(TmpNumber)+"." + ftype;
if (DoExport(ReportFile,ReportDataSource,TmpFileName,FileType)==true)
{
page.Response.ClearContent();
page.Response.ClearHeaders();
page.Response.ContentType="application/"+ftype;
Response.AddHeader("Content-Disposition", "attachment;FileName=" + (string)this.Page.Session[rptID] + "." + ftype);
System.IO.FileStream f=new System.IO.FileStream(TmpFileName,System.IO.FileMode.Open);
byte[] pContent=new byte[f.Length];
f.Read(pContent,0,(int)f.Length);
f.Close();
page.Response.WriteFile(TmpFileName);
page.Response.Flush();
page.Response.Close();
System.IO.File.Delete(TmpFileName);
}
}
catch(Exception ex)
{
Funlib.ShowMessage(ex.Message.ToString().Trim(),this);
}
}
现在导出文件的问题解决了,在win2000和win2003上面跑没有问题可以一到了xp上面 ReportDoc.Export(); 这个方法就会出错,错误提示为:“拒绝访问报表文件。其他程序可能正在使用它。”找了半天才发现原因就是ASPNET的用户权限不够,目前的解决办法是把ASPNET加入administrators组中,可是这样一来,系统的安全性就得不到保证了。现在还没有想到更好的解决办法,不知道哪位高手曾经遇到过类似的问题,有没有更好的解决办法?
.net中的CrystalReportViewer自带了一个export的功能,可是不知为什么只要放到iframe里面就只能导出一次,连续导第二次的时候就会报错,没办法就只好自己写了一个导出页面,主要的导出和保存方法如下:
/// <summary>
/// Function : 导出报表文件为其他文件格式
/// </summary>
/// <param name="ReportFile">报表文件名称</param>
/// <param name="ReportDataSource">报表文件所使用的数据源Dataset</param>
/// <param name="FileName">要导成的目标文件名称</param>
/// <param name="FileType">要导成的目标文件类型</param>
/// <returns>bool成功返回true,失败返回false</returns>
public bool DoExport(string ReportFile,object ReportDataSource,string FileName,string FileType)
{
try
{
ReportDoc.Load(ReportFile);
ReportDoc.SetDataSource(ReportDataSource);
FileOPS.DiskFileName=FileName;
ExOPS=ReportDoc.ExportOptions;
ExOPS.DestinationOptions=FileOPS;
ExOPS.ExportDestinationType=CrystalDecisions.Shared.ExportDestinationType.DiskFile;
switch (FileType)
{
case "CrystalReports":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.CrystalReport;
break;
case "PDF":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.PortableDocFormat;
break;
case "MSWord":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.WordForWindows;
break;
case "MSExcel":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.Excel;
break;
case "RecordToMSExcel":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.ExcelRecord;
break;
case "RTF":
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.RichText;
break;
}
ReportDoc.Export();
return true;
}
catch(Exception ex)
{
Funlib.ShowMessage(ex.Message.ToString().Trim(),this);
return false;
}
}
/// <summary>
/// Function : 保存文件
/// </summary>
/// <param name="ReportFile">报表文件名称</param>
/// <param name="ReportDataSource">数据源Dataset</param>
/// <param name="page">当前页面</param>
/// <param name="FileType">文件类型</param>
public void SaveFile(string ReportFile,object ReportDataSource,System.Web.UI.Page page,string FileType)
{
try
{
int temp;
temp=System.Convert.ToInt32(System.DateTime.Now.Millisecond.ToString());
System.Random ra=new System.Random(temp);
int TmpNumber=ra.Next();
string ftype = "";
switch (FileType)
{
case "CrystalReports":
ftype = "rpt";
break;
case "PDF":
ftype = "pdf";
break;
case "MSWord":
ftype = "doc";
break;
case "MSExcel":
case "RecordToMSExcel":
ftype = "xls";
break;
case "RTF":
ftype = "rtf";
break;
}
string TmpFileName="c:\\"+System.Convert.ToString(TmpNumber)+"." + ftype;
if (DoExport(ReportFile,ReportDataSource,TmpFileName,FileType)==true)
{
page.Response.ClearContent();
page.Response.ClearHeaders();
page.Response.ContentType="application/"+ftype;
Response.AddHeader("Content-Disposition", "attachment;FileName=" + (string)this.Page.Session[rptID] + "." + ftype);
System.IO.FileStream f=new System.IO.FileStream(TmpFileName,System.IO.FileMode.Open);
byte[] pContent=new byte[f.Length];
f.Read(pContent,0,(int)f.Length);
f.Close();
page.Response.WriteFile(TmpFileName);
page.Response.Flush();
page.Response.Close();
System.IO.File.Delete(TmpFileName);
}
}
catch(Exception ex)
{
Funlib.ShowMessage(ex.Message.ToString().Trim(),this);
}
}
现在导出文件的问题解决了,在win2000和win2003上面跑没有问题可以一到了xp上面 ReportDoc.Export(); 这个方法就会出错,错误提示为:“拒绝访问报表文件。其他程序可能正在使用它。”找了半天才发现原因就是ASPNET的用户权限不够,目前的解决办法是把ASPNET加入administrators组中,可是这样一来,系统的安全性就得不到保证了。现在还没有想到更好的解决办法,不知道哪位高手曾经遇到过类似的问题,有没有更好的解决办法?