Как создать отчет из кода веб-приложения

Как создать отчет из кода веб-приложения

Порой создание отчета может превратиться в настоящую головную боль. Например, когда вам нужно управлять содержимым отчета в зависимости от условий в программе. Проще это сделать в коде программы, чем передавать в отчет параметры и организовывать логику в скрипте отчета.

Сегодня мы рассмотрим, как создать отчет из кода приложения. Но не обычного десктоп приложения, а веб-приложения на ASP.NET Core MVC. Ранее мы уже рассматривали, как создавать отчет в коде WinForms приложения. Но сейчас гораздо более популярны веб-приложения и многие пользователи FastReport хотели бы использовать все возможности этого генератора отчетов именно в них.

Давайте рассмотрим, как же создать шаблон отчета и запустить его не прибегая к дизайнеру отчетов. Сперва нам потребуется проект ASP.NET Core MVC приложения. Для работы с генератором отчетов FastReport.NET неоходимо установить его библиотеки с помощью менеджера пакетов NuGet.

Так как пакеты библиотек расположены на локальном диске (в каталоге установленной программы в папке Nuget), то нам потребуется добавить локальный источник пакетов. Для этого нажмите на значок с шестеренкой в правом верхнем углу диспетчера пакетов и добавьте новый источник, который будет ссылаться на локальную папку с вашими пакетами (с расширением .nupkg):

Добавляем новый локальный источник пакетов

Теперь можно выбрать добавленный источник пакетов в выпадающем списке и установить пакеты.

Установленные из локального источника пакеты

Чтобы воспользоваться добавленными библиотеками в коде программы, нужно предварительно подключить их в файле Startup.cs. Добавим строчку в методе конфигурации:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {

app.UseFastReport();

}

Теперь можно перейти непосредственно к программированию. В нашем MVC проекте есть:

  1. Контроллеры, содержащие логику серверной части приложения.
  2. Представления отображают информацию клиенту.
  3. Модели отвечают за работу с данными (получение, хранение, преобразование и запись).

В нашем простом примере потребуются лишь контроллер и представление. Давайте изменим метод Index в контроллере. В нашем приложении, которое сгенерировано автоматически по шаблону, уже есть готовый контроллер - HomeController:

using FastReport.Web;
using FastReport;
using FastReport.Table;
using System.Data;
using FastReport.Data;
using System.Drawing;
using FastReport.Utils;
 
 public IActionResult Index()
 {
 //Создаем объект веб отчета
 WebReport report = new WebReport();
 
//Создаем объект веб страницы
 ReportPage page = new ReportPage();
 page.Name = "Page1";
 
//Добавляем страницу в отчет
 report.Report.Pages.Add(page);
 
 //Создаем источник данных
 DataSet ds = new DataSet();
 ds.ReadXml("C:/Users/FR/source/repos/WebApp/WebApp/Reports/nwind.xml");
 
 //Регистрируем источник данных в отчете
 report.Report.RegisterData(ds);
 
 //Включаем таблицу в отчете
 report.Report.GetDataSource("Products").Enabled = true;
 
//Создаем бэнд данных
 DataBand dataBand = new DataBand();
 dataBand.Name = "DataBand";
 
 //Получаем таблицу из источника данных отчета
 DataSourceBase data = report.Report.GetDataSource("Products");
 //Инициализируем источник данных
 data.Init();
 //И получаем первую строку данных
 data.First();
 
 //Добавляем бэнд данных на страницу
 page.Bands.Add(dataBand);
 
 //Создаем объект талица
 TableObject table = new TableObject();
 table.Name = "Table1";
//Задаем количество строк - количество строк в источнике + заголовок
 table.RowCount = data.RowCount+1;
 //Задаем количество колонок
 table.ColumnCount = 2;
 
//Устанавливаем авторазмер первой колонки, в которой будут выводиться названия продуктов
 table.Columns[0].AutoSize = true;
 //Задаем заголовки в первой строке таблицы
 table[0, 0].Text = "Product Name";
 table[0, 0].Border.Lines = BorderLines.All;
 table[1, 0].Text = "Unit Price";
 table[1, 0].Border.Lines = BorderLines.All;
 
 int i = 1;
 //Цикл по всем строкам в источнике данных
 while(data.HasMoreRows)
 { 
 //Отображаем наименования продуктов
 table[0, i].Text = data["ProductName"].ToString();
 table[0, i].Border.Lines = BorderLines.All;
 //Отображаем цены
 table[1, i].Text = data["UnitPrice"].ToString();
 table[1, i].Border.Lines = BorderLines.All;
 
//Создаем объект картинка
 PictureObject picture = new PictureObject();
 picture.Bounds = new RectangleF(40, 0, Units.Centimeters * 0.5f, Units.Centimeters * 0.5f);
 picture.CreateUniqueName();
 //В зависимости от значения цены мы выбираем какую картину отображать в ячейке таблицы
 if ((decimal)data["UnitPrice"] < 20)
 {
 picture.Image = Image.FromFile("C:/Users/FR/Downloads/28.png");
 }
 else 
 {
 picture.Image = Image.FromFile("C:/Users/FR/Downloads/29.png");
 }
 
 picture.LoadImage(); 
//Загружаем изображение в объект
 picture.Parent = table[1, i]; 
//Присваиваем родительский объект для картинки - ячейка таблицы
 i++;
 data.Next(); 
//Берем следующую запись из источника
 }
 
 dataBand.Objects.Add(table); 
//Добавляем объект таблица на страницу отчета
 
 ViewBag.WebReport = report; 
//Передаем отчет в представление
 return View();
 }

Из комментариев к коду понятно, что мы создаем объекты отчета вручную и выстраиваем их иерархию. Сейчас мы создали табличный отчет с картинками в ячейках. В зависимости от значения цены, выбирается нужная картинка. Это как раз таки типичный пример, когда вам может потребоваться создание отчета из кода программы.

Теперь изменим представление Index.cshtml. Оставим всего лишь одну строку:

@await ViewBag.WebReport.Render()

На этом всё. Можно запустить приложение и посмотреть наш отчет:

Так выглядит готовый отчет

Подведем итог. По сути, создание отчета из кода веб-приложения ничем не отличается от обычного десктоп приложения. С одной стороны, создание отчета из кода требует достаточно глубоких знаний о структуре отчета и его объектах, а значит - для его создания требуется квалифицированный специалист. С другой стороны - иногда это единственная возможность создать отчет со сложной логикой. Поэтому не стоит рассматривать этот способ создания отчетов как основой. Но он выручит вас в трудную минуту.