Tshumore Ответов: 2

Как сохранить crystal report на определенный путь к диску при использовании динамического имени файла


Я хочу создать отчет Crystal таким образом, чтобы при создании он экспортировался в папку на моем сервере приложений. Кроме того, я хочу, чтобы отчет также имел динамическое имя. В настоящее время сгенерированный отчет принимает имя ActionResult в качестве своего имени и загружается в папку Downloads.

Я внес изменения в источник но у меня есть исключение при указании этих параметров "Невозможно неявно преобразовать тип void в 'System.I0.Stream'".

Вот как я генерирую отчет после добавления параметров в отчет. течение пример. Исключение также происходит на этой линии:

public ActionResult AuditTrail()
      {

          SqlConnection con = new SqlConnection(Helpers.DatabaseConnect);
          DataTable dt = new DataTable();
          try
          {

              DateTime Today = DateTime.Today;
              var startdate = new DateTime(Today.Year, Today.Month, 1);
              var enddate = startdate.AddMonths(1).AddDays(-1);

              con.Open();
              SqlCommand cmd = new SqlCommand("SELECT Action,CreatedBy,CreatedOn,Entity,Username,Checker FROM Trail ", con);
              SqlDataAdapter adp = new SqlDataAdapter(cmd);
              adp.Fill(dt);

          }
          catch (Exception ex)
          {
              ViewBag.ErrorMessage = Helpers.Messages.GENERAL_ERROR;
              return View();
          }

          DateTime Todayy = DateTime.Today;
          var startdatte = new DateTime(Todayy.Year, Todayy.Month, 1);
          var enddatte = startdatte.AddMonths(1).AddDays(-1);

          string filename = "Trail";
          string OutputFileName = filename.ToString();

          //string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".pdf";

          ReportClass rptH = new ReportClass();
          rptH.FileName = Server.MapPath(("~/Reports/") + "AuditTrail.rpt");
          rptH.Load();
          rptH.SetDataSource(dt);

          Stream stream = rptH.ExportToDisk(ExportFormatType.PortableDocFormat, @"C:\Users\myuser\source\repos\MyProject\MySolution\GeneratedReports\" + OutputFileName + "_" + enddatte + ".pdf");

          return File(stream, "application/pdf");
      }


Что я упускаю?

Что я уже пробовал:

Я попытался использовать CrystalDecisions.Общий.DiskFileDestinationOptions, но я не уверен, как его можно использовать с потоком.

2 Ответов

Рейтинг:
2

Tshumore

Это решило мою проблему-я могу генерировать, просматривать(в новом окне браузера) и сохранять в указанном каталоге сервера, используя динамическое имя

public ActionResult AuditTrail()
       {
           string batch = string.Empty;
           batch = System.Web.HttpContext.Current.Session["BatchId"].ToString();

           SqlConnection con = new SqlConnection(Helpers.DatabaseConnect);
           DataTable dt = new DataTable();
           try
           {

               DateTime Today = DateTime.Today;
               var startdate = new DateTime(Today.Year, Today.Month, 1);
               var enddate = startdate.AddMonths(1).AddDays(-1);

               con.Open();
               SqlCommand cmd = new SqlCommand("SELECT Action,CreatedBy,CreatedOn,Entity,Username,Checker FROM Trail ", con);
               SqlDataAdapter adp = new SqlDataAdapter(cmd);
               adp.Fill(dt);

           }
           catch (Exception ex)
           {
               ViewBag.ErrorMessage = Helpers.Messages.GENERAL_ERROR;
               return View();
           }

           string OutputFileName = batch;

           //string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".pdf";

           ReportClass rptH = new ReportClass();
           rptH.FileName = Server.MapPath(("~/Reports/") + "AuditTrail.rpt");
           rptH.Load();
           rptH.SetDataSource(dt);
           string filePath = Server.MapPath("~/GeneratedReports/") + OutputFileName + ".pdf";
           rptH.ExportToDisk(ExportFormatType.PortableDocFormat, filePath);
           Stream stream = rptH.ExportToStream(ExportFormatType.PortableDocFormat);

           return File(stream, "application/pdf");
       }


Однако я получаю ошибку "Формат данного пути не поддерживается" когда я пытаюсь назвать файл так, как мне бы хотелось . т. е. с использованием BatchId и текущей даты окончания месяца :

string batch = string.Empty;
          batch = System.Web.HttpContext.Current.Session["BatchId"].ToString();
          DateTime Todayy = DateTime.Today;
          var startdatte = new DateTime(Todayy.Year, Todayy.Month, 1);
          var enddatte = startdatte.AddMonths(1).AddDays(-1);
          var monthend = enddatte.ToString();
          string OutputFileName = batch + " " + monthend;
          string filePath = Server.MapPath("~/GeneratedFolder/") + OutputFileName + ".pdf";
          rptH.ExportToDisk(ExportFormatType.PortableDocFormat, filePath);


phil.o

Вероятно, потому, что часть даты в имени файла содержит символы (т. е., /) которые недопустимы в имени файла.
Поместите точку останова в строку, где вы объявляете monthend переменная, и вы сможете определить, что она содержит; затем сопоставьте ее со списком запрещенных символов для файловой системы, в которую вы пытаетесь написать, и соответствующим образом измените свой код.

Рейтинг:
1

Richard MacCutchan

Если вы посмотрите на документацию по адресу Метод ReportDocument.ExportToDisk (CrystalDecisions.CrystalReports.Двигатель) | Microsoft Docs[^], вы можете ясно видеть, что ExportToDisk не возвращает объект потока.


Maciej Los

Чтение документации-это лучший способ решить проблему!

Tshumore

Спасибо, ребята, но есть ли что-то неладное в том, как я передаю параметры потоку

Richard MacCutchan

Да, пожалуйста, прочтите мое сообщение еще раз. Вызов ExportToDisk делает нет возвращает объект stream, поэтому вы не можете использовать его в File конструктор в следующей строке.

Richard MacCutchan

Странно, что так много "разработчиков" никогда не думают об этом. :(