예제 #1
0
        public IActionResult Get(int id, [FromQuery] ReportQuery query)
        {
            string mime = "application/" + query.Format;                        //MIME-заголовок со значением по умолчанию
                                                                                // Найти отчет
            Reports reportItem = reportItems.FirstOrDefault((p) => p.Id == id); //получаем значение коллекции по идентификатору

            if (reportItem != null)
            {
                string webRootPath = _hostingEnvironment.WebRootPath;                      //определяем путь к папке wwwroot
                string reportPath  = (webRootPath + "/App_Data/" + reportItem.ReportName); //определяем путь к отчету

                string dataPath = "";
                switch (reportItem.Id)
                {
                case 1:
                    dataPath = (webRootPath + "/App_Data/XmlDataSet2.xml");    //определяем путь к базе данных
                    MainDataSet.ConnectToData(_configuration.GetConnectionString("CatalogConnection"), dataPath);
                    break;

                case 2:
                    dataPath = (webRootPath + "/App_Data/XmlDataSet.xml");    //определяем путь к базе данных
                    MainDataSet.ConnectToDataReport2(_configuration.GetConnectionString("CatalogConnection"), dataPath);
                    break;
                }

                using (MemoryStream stream = new MemoryStream())     //Создаем поток для отчета
                {
                    try
                    {
                        using (DataSet dataSet = new DataSet())
                        {
                            //Заполняем источник данными
                            dataSet.ReadXml(dataPath);
                            //Включаем веб режим FastReport
                            Config.WebMode = true;
                            using (Report report = new Report())
                            {
                                report.Load(reportPath);                    //Загружаем отчет
                                report.RegisterData(dataSet, "Connection"); //Регистрируем данные в отчете
                                if (query.Parameter != null)
                                {
                                    report.SetParameterValue("Parameter", query.Parameter); //задаем значение параметра отчета, если передано значение параметра в URL
                                }
                                report.Prepare();                                           //подготавливаем отчет
                                                                                            //если выбран формат pdf
                                if (query.Format == "pdf")
                                {
                                    //Экспорт отчета в PDF
                                    PDFExport pdf = new PDFExport();
                                    //Используем поток для хранения отчета, чтобы не создавать лишние файлы
                                    report.Export(pdf, stream);
                                }
                                //если выбран формат отчета html
                                else if (query.Format == "html")
                                {
                                    //Экспорт отчета в HTML
                                    HTMLExport html = new HTMLExport();
                                    html.SinglePage    = true;     //отчет на одной странице
                                    html.Navigator     = false;    //навигационная панель сверху
                                    html.EmbedPictures = true;     //встраивает изображения в документ
                                    report.Export(html, stream);
                                    mime = "text/" + query.Format; //переопределяем mime для html
                                }
                            }
                        }
                        //получаем имя результирующего файла отчета с нужным расширением
                        var file = String.Concat(Path.GetFileNameWithoutExtension(reportPath), ".", query.Format);
                        //если параметр inline истина, то открываем отчет в браузере
                        if (query.Inline)
                        {
                            return(File(stream.ToArray(), mime));
                        }
                        else
                        {
                            //иначе скачиваем файл отчета
                            return(File(stream.ToArray(), mime, file)); // attachment
                        }
                    }
                    //Обрабатываем исключения
                    catch
                    {
                        return(new NoContentResult());
                    }
                    finally
                    {
                        stream.Dispose();
                    }
                }
            }
            else
            {
                return(NotFound());
            }
        }