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

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 влияет на то, что картинка будет отображена в ячейке. Давайте посмотрим, как она будет выглядеть:

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

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

.NET FastReport WinForms .NET FastReport WinForms
10 июля 2026

Как настроить Content Security Policy для отчетов FastReport .NET WEB

Узнайте, как настроить Content Security Policy для отчётов FastReport .NET WEB: обзор директив и значений CSP, изменения в архитектуре FastReport, типичные сценарии обхода и способы защиты.
22 июня 2026

Как настроить отчет с Business Objects из кода и дизайнера в FastReport .NET

В этой статье рассматривается реальный пример создания и использования шаблона отчета .frx для подключения к иерархическим бизнес-объектам в FastReport .NET.
21 апреля 2026

Использование водяных знаков в FastReport VCL

В статье подробно рассмотрели функционал добавления водяных знаков в FastReport VCL — как через визуальный интерфейс, так и программно, с помощью кода на Delphi и в скриптах отчётов.

Не является публичной офертой
© 1998-2026 ООО «Быстрые отчеты»