离开水的鱼

——飞来飞去!游去游来!俺的收藏夹

导航

报表导出问题及解决

Posted on 2004-11-04 16:22  Gavin  阅读(1817)  评论(3编辑  收藏  举报
今天搞了一天水晶报表,真是郁闷啊!
.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组中,可是这样一来,系统的安全性就得不到保证了。现在还没有想到更好的解决办法,不知道哪位高手曾经遇到过类似的问题,有没有更好的解决办法?