Страница 1 из 1

Автоматический экспорт отчёта

Добавлено: 25 сен 2007, 11:22
Eugene A. Bykov
Добрый день!
В веб-приложении я успешно могу сгенерировать отчёт и сохранить его в файл без выведения в StiWebViewer:

Код: Выделить всё

                Stimulsoft.Report.StiReport Report = null;
                Report = Stimulsoft.Report.StiReport.GetReportFromAssembly(Server.MapPath("compiled_report.dll"));
                Report.RegData(dataTable);
                Report.Render();
                Report.ExportDocument(Stimulsoft.Report.StiExportFormat.Pdf, @"C:\report.pdf");
В результате я получаю на сервере файл C:\REPORT.PDF. Всё совершенно логично.
Вопрос в том, возможно ли отдать пользователю окошко с предложением сохранить у себя файл без необходимости отображения его в StiWebViewer? То есть упрощённо - пользователь нажимает кнопку отчёт и получает предложение сохранить где-то у себя автоматически сгенерированный файл отчёта в нужном ему формате, в частности, в PDF. Что происходит программно? После нажатия на кнопку формируется отчёт, т.е. грузится шаблон, извлекаются данные и т.д. Затем формируется файл, который и хотелось бы отдать пользователю.
Проблема возникла из-за сложного представления данных в HTML... Т.е. выглядят отчёты некрасиво в окошке IE, да и большие, пользователю проще сохранить у себя PDF файл, чем прокручивать окно браузера... При этом еще и из-за проблем с памятью периодически отчёты "слетают", т.е. выскакивает Object reference not set to an instance of an object, хотя UseCache=true, а ошибка появляется после некоторого времени простоя компьютера, когда кэш уже очистился. В результате возникла идея попробовать отдать сразу PDF.
Спасибо!

Автоматический экспорт отчёта

Добавлено: 25 сен 2007, 11:29
Edward
Да, это возможно.

Используйте, пожалуйста, следующий код:

Код: Выделить всё

StiReportResponse.ResponseAsPdf(this, report);
Таким образом, отчет будет отображен в pdf формате у клиента.

Спасибо.

Автоматический экспорт отчёта

Добавлено: 26 сен 2007, 04:59
Eugene A. Bykov
Интересно. У меня существует 2 формы - задание параметров отчета, затем, используя

Код: Выделить всё

Server.Transfer
я перехожу на форму отчёта. Чтобы протестировать, я просто добавил

Код: Выделить всё

StiReportResponse.ResponseAsPdf(this, report);
в конце обработчика PageLoad второй страницы, на которой установлен StiWebViewer, рассчитывя, что я получу предложение сохранить PDF, а затем на экране увижу StiWebViewer. Однако я никуда не переадресуюсь с первой страницы, а сразу вижу предложение сохранения отчёта... Такое впечатление, что даже postback не проиходит. На самом деле это именно такое поведение, как я задумывал, однако я рассчитывал перенести код по генерации отчёта на первую страницу, от второй вообще избавиться...
А вообще вопрос - несмотря на то, что я получил желаемый результат, ожидаемо было иное... Почему не отображается отчёт в StiWebViewer на второй странице, если я использую ResponseAsPdf? Этот Response перекрывает все остальные, включая Server.Transfer?
И возможно ли исполнить какой-либо код после вызова ResponseAsPdf?
Спасибо!

Автоматический экспорт отчёта

Добавлено: 28 сен 2007, 09:05
Eugene A. Bykov
А вообще возможно узнать, открыл ли пользователь документ отчёта, сохранил ли он его или нажал отмену? И можно ли выполнять какие-либо действия после того как отработал ResponseAsPdf?
Спасибо!

Автоматический экспорт отчёта

Добавлено: 28 сен 2007, 10:31
Vital
А вообще вопрос - несмотря на то, что я получил желаемый результат, ожидаемо было иное... Почему не отображается отчёт в StiWebViewer на второй странице, если я использую ResponseAsPdf? Этот Response перекрывает все остальные, включая Server.Transfer?
И возможно ли исполнить какой-либо код после вызова ResponseAsPdf?
После вызова метода ResponseAsPdf код больше не исполняется. Вот метод, который мы используем:

Код: Выделить всё

public static void ResponseAs(Page page, MemoryStream stream, string contentType, string fileName, bool openDialog)
		{
			page.Response.Buffer = true;
			page.Response.ClearContent();
			page.Response.ClearHeaders();
			page.Response.ContentEncoding = System.Text.Encoding.UTF8;
			
			if (openDialog)
			{
				page.Response.ContentType = string.Format("{0};{1};", contentType, fileName);
				page.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
			}
			else page.Response.ContentType = contentType;

			page.Response.AddHeader("content-length", stream.Length.ToString());
			page.Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
			page.Response.Cache.SetCacheability(HttpCacheability.Private);
			page.Response.BinaryWrite(stream.ToArray());

            if (StiOptions.Engine.FullTrust)
            {
                page.Response.Flush();
                page.Response.End();
            }
		}
А вообще возможно узнать, открыл ли пользователь документ отчёта, сохранил ли он его или нажал отмену?
При помощи методов Stimulsoft Reports Вы сделать этого не сможите. Возможно можно использовать JavaScript.

Спасибо.