Как создать отчет с таблицей из собственного кода

08.02.2022

Как программно создать отчет с таблицей из собственного кода

Вспомним довольно частую ситуацию, когда вам нужно сделать что-либо очень быстро и буквально “на коленках”. Но не будем забывать, что структура и содержание отчета зависит от внешних факторов. Генератор отчетов FastReport.NET очень гибкий продукт и дает вам два способа решения этой проблемы.

Способ 1. Создавать структуру отчета в коде пользовательского приложения.
Способ 2. Управлять поведением отчета внутри, с помощью скрипта.

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

Объект таблица (Table) может быть заполнен статическими данными, или динамическими. В первом случае мы знаем конкретные размеры таблицы и сразу же вносим данные в ячейки из фиксированного набора.

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

Давайте создадим WinForms приложение. Подключим в ссылках библиотеку FastReport.dll, которую вы можете найти в папке с установленным генератором отчетов. Добавим на форму кнопку, которая будет запускать построение отчета. И не забываем создать для нее обработчик нажатия.

Прежде всего подключаем библиотеки FastReport.

using FastReport;
using FastReport.Data;
using FastReport.Table;
using FastReport.Utils;
 
private void button1_Click(object sender, EventArgs e)
{
using (Report report = new Report()) 
//Создаем объект отчета
 {
 ReportPage page = new ReportPage(); 
//Создаем объект страницы отчета
 page.Name = "Page1"; 
//Задаем имя страницы
 report.Pages.Add(page); 
//Добавляем страницу в коллекцию страниц отчета
 DataSet ds = new DataSet(); 
//Создаем источник данных
 ds.ReadXml("~/../../../App_Data/nwind.xml"); 
//Загружаем в него базу данных xml
 report.RegisterData(ds); 
//Регистрируем источник данных в отчете
 report.GetDataSource("Products").Enabled = true; 
//Включаем источник данных 
 DataBand dataBand = new DataBand(); 
//Создаем бэнд с данными
 dataBand.Name = "DataBand"; 
//Задаем имя бэнда
 page.Bands.Add(dataBand); 
//Добавляем бэнд в коллекцию бэндов страницы
 
 TableObject table = new TableObject(); 
//Создаем объект таблицы
 table.Name = "Table1"; 
//Задаем имя объекта 
 table.RowCount = 10; 
//Задаем количество строк 
 table.ColumnCount = 2; 
//Задаем количество колонок
 
//В цикле заполняем все ячейки какими-либо данными
 for (int i = 0; i < 10; i++)
 for (int j = 0; j < 2; j++)
 {
 table[j, i].Text = (10 * i + j + 1).ToString();
 table[j, i].Border.Lines = BorderLines.All;
 }
 
 dataBand.Objects.Add(table);
 //dataBand.Objects.Add(picture);
 if (report.Prepare())
 report.ShowPrepared();
 }

 

Таблица, заполненная произвольными данными

А теперь рассмотрим случай, когда таблицу нужно заполнить данными из источника. Заменим цикл выше на другой код:

table.Columns[0].AutoSize = true;
 //table.Columns[1].AutoSize = true;
 
 DataSourceBase data = report.GetDataSource("Products");
 data.Init(); 
//Инициализируем источник данных
 data.First(); 
//Получаем первую запись
 
 for (int i = 0; i < 10; i++)
 {
 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;
 data.Next();
 }

В результате мы получим таблицу, с данными из базы:

Таблица, заполненная данными из базы

Без заголовка таблица выглядит неполноценно. Давайте добавим его:

table.RowCount = 11;

 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;
 
 for (int i = 1; i < 10; i++)
 {
 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;
 
 data.Next();
 }

Уточню, что в первой строке таблицы мы задали заголовки, значит цикл начинаем не с первого, а со второго элемента.

Таблица с заголовками

Рассмотрим последний на сегодня случай - как поместить объект в ячейку таблицы. Например, картинку:

PictureObject picture = new PictureObject();
 //Создаем объект картинки
 picture.Bounds = new RectangleF(40, 0, Units.Centimeters * 0.5f, Units.Centimeters * 0.5f);
//Задаем размер объекта
picture.CreateUniqueName(); //Задаем произвольное имя picture.Image = Image.FromFile("C:/Users/FR/Downloads/28.png"); //Задаем путь к изображению picture.LoadImage(); //Загружаем изображение picture.Parent = table[1, 1]; //Задаем родительский объект для изображения

Именно свойство Parent влияет на то, что картинка будет отображена в ячейке. Давайте посмотрим, как она будет выглядеть:

Таблица с картинкой в ячейке

Таким образом, мы рассмотрели способ создания таблицы в отчете из кода приложения и два варианта её заполнения - статическим данными и динамическими. Кроме того, теперь вы знаете о возможностях программного добавления объекта в ячейку таблицы.

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.