2017-01-14 1 views
1

가 나는 PDF로 FastReport가 설계 한 것으로 .frx 보고서를 내보낼 이하의 코드와 같은 교류 # 웹 양식 응용 프로그램에서 파일을 엑셀 : 나는 수출오류의 asp.net C#을에 PDF로 fastreport 수출

public static bool ShowReport(string ReportFileName, DataTable ReportData, string DBObjectName, string ExportType, out string Message, params string[] AdditionalParams) 
    { 
     FastReport.Utils.Config.WebMode = true; 
     string ReportFile = HttpContext.Current.Server.MapPath(WPResources.ReportsRoot) + string.Format("{0}_{1}.frx", ReportFileName, ExportType.ToUpper()); 

     FastReport.Report objReport = new FastReport.Report(); 
     objReport.Load(ReportFile); 
     objReport.Dictionary.Connections.Clear(); 
     System.Data.DataTable resultTable = new DataTable(); 

     objReport.RegisterData(ReportData, DBObjectName); 
     objReport.GetDataSource(DBObjectName).Enabled = true; 


     int ParamsCount = AdditionalParams.Length; 
     if ((ParamsCount % 2) != 0) 
      ParamsCount--; 

     for (int i = 0; i < ParamsCount; i += 2) 
     { 
      var DynamicControl = (objReport.FindObject(AdditionalParams[i]) as FastReport.TextObject); 
      if (DynamicControl != null) 
      { 
       DynamicControl.Text = AdditionalParams[i + 1]; 
       DynamicControl.Visible = !string.IsNullOrEmpty(AdditionalParams[i + 1]); 
      } 
     } 

     (objReport.FindObject("rptData") as FastReport.DataBand).DataSource = objReport.GetDataSource(DBObjectName); 

     string fileName = Path.GetFileNameWithoutExtension(ReportFile); 
     fileName += "_" + WPFarsiDate.Today.ToString().Replace("/", ".") + "_" + 
      DateTime.Now.Hour.ToString() + "." + 
      DateTime.Now.Minute.ToString(); 

     if (ExportType == "Excel") 
     { 
      using (MemoryStream objMemoryStream = new MemoryStream()) 
      { 
       objReport.Prepare(false); 
       FastReport.Export.OoXML.Excel2007Export objExcel2007Export = new FastReport.Export.OoXML.Excel2007Export(); 
       objExcel2007Export.OpenAfterExport = false; 
       objExcel2007Export.Export(objReport, objMemoryStream); 
       byte[] buffer = objMemoryStream.ToArray(); 
       HttpContext.Current.Response.ClearHeaders(); 
       HttpContext.Current.Response.Clear(); 
       HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; 
       HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("inline;filename={0}.xlsx", fileName)); 
       HttpContext.Current.Response.BinaryWrite(buffer); 
       HttpContext.Current.Response.End(); 
      } 
     } 
     else if (ExportType == "Pdf") 
     { 
      using (MemoryStream objMemoryStream = new MemoryStream()) 
      { 
       objReport.Prepare(false); 
       FastReport.Export.Pdf.PDFExport objPDFExport = new FastReport.Export.Pdf.PDFExport(); 
       objPDFExport.EmbeddingFonts = true; 
       objPDFExport.OpenAfterExport = false; 
       objPDFExport.Export(objReport, objMemoryStream); 
       byte[] buffer = objMemoryStream.ToArray(); 
       HttpContext.Current.Response.ClearHeaders(); 
       HttpContext.Current.Response.Clear(); 
       HttpContext.Current.Response.ContentType = "application/octet-stream"; 
       HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}.pdf", fileName)); 
       HttpContext.Current.Response.Clear(); 
       HttpContext.Current.Response.BinaryWrite(buffer); 
       HttpContext.Current.Response.End(); 

      } 
     } 

     Message = string.Empty; 
     return true; 
    } 

그것은 탁월합니다. 그것은 어떤 문제도 아니며 성공할 수 있습니다. 내가 PDF로 내보낼 때,이 오류를 얻을 : 언급 한 오류가 바로 메인 서버에서 발생하고 작업이 로컬 호스트에서 성공적으로 수행 할 수 있음을

Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.

그것은 주목해야한다. 누군가이 문제에 대한 해결책을 설명 할 수 있다면 매우 유용 할 것입니다.

답변

1

많은 노력 끝에 문제의 해결책을 찾았습니다. .frx 파일에 사용 된 글꼴은 windows/fonts 폴더가 아닙니다. 그래서 거기에 글꼴을 복사하고 제대로 작동했습니다.

0

디버그 해 보셨습니까? 어떤 줄이이 오류를 던집니까? 데스크톱 버전의 대화 상자 창이 보였습니까? 그것을 피하십시오.