Создание PDF отчета в JetBrains Rider (C#) на «Альт Рабочая станция К» 10

Создание PDF отчета в JetBrains Rider (C#) на «Альт Рабочая станция К» 10

В этой статье мы взглянем на мир платформы .NET в «Альт Рабочая станция К» 10 без использования Microsoft Visual Studio, так как ее невозможно установить на Linux, и создадим отчет, который можно экспортировать в формат PDF. Аналог Visual Studio на данный момент – конечно же JetBrains Rider. Это кроссплатформенная интегрированная среда разработки программного обеспечения для платформы .NET, разрабатываемая компанией JetBrains. Поддерживаются языки программирования C#, VB.NET и F#.

Мы не будем здесь обсуждать, какая IDE лучше или хуже. Поэтому просто создадим, построим, и экспортируем отчет/документ формата PDF из JetBrains Rider с использованием FastReport .NET.

Что нужно для начала? Как минимум необходимо иметь на своем ПК установленную IDE JetBrains Rider. А также учесть специфику Linux и произвести дополнительную настройку.

Прежде всего для Linux нам потребуются дополнительные библиотеки, которые могут быть не установлены по умолчанию:

Настройка Linux на примере «Альт Рабочая станция К» 10:

1. Открыть консоль;
2. Обновить apt-get и установить пакеты:

Далее создадим новое решение, выбрав «New Solution».

Приветственная форма IDE JetBrains Rider

Следом идёт настройка проекта. Выбираем тип проекта Console Application в разделе .NET/ .NET Core. Затем даём название проекту, в качестве примера используем «ReportPDF_Core_ConsoleApp». После нажимаем на тип Console Application, язык C#, фреймворк NET 6.0.

Форма настройки проекта перед созданием

Начнем с того, что добавим простой пример набора данных для нашего отчета, в коде нашего приложения. Для этого в Program.cs добавим:

 using System.Data;

Следом добавим переменную:

//создание объекта набора данных 
DataSet dataSet = new DataSet();

Добавим функцию CreateDataSet, в котором создадим и заполним набор данных:

void CreateDataSet()
{
 // создаем простой набор данных с помощью одной таблицы 
 // создаем простой набор данных
 dataSet = new DataSet();
 
 // создаем таблицу
 DataTable table = new DataTable();
 table.TableName = "Сотрудники";
 // добавляем таблицу в набор данных
 dataSet.Tables.Add(table);
 
 // добавление данных в таблицу
 table.Columns.Add("ID", typeof(int));
 table.Columns.Add("Имя", typeof(string));
 table.Rows.Add(1, "Андрей Иванов");
 table.Rows.Add(2, "Николай Федоров");
 table.Rows.Add(3, "Александр Петров");
}

И добавляем вызов функции CreateDataSet:

//создание объекта набора данных 
DataSet dataSet = new DataSet();
CreateDataSet();

Какой самый простой способ заставить работать FastReport .NET в JetBrains Rider? Использовать наш Приватный NuGet-сервер.

По этой статье описано добавление NuGet-пакетов после приобретения FastReport .NET. Вот для вас краткая инструкция, чтобы не переходить в другую статью. Нажимаем внизу IDE на вкладку NuGet, а кликаем по вкладке Sources.

Форма настройки NuGet

Теперь добавляем новый репозиторий с помощью нажатия на «+» и вносим необходимые данные:

- Name - имя источника без пробелов (например FastReport);
- URL - https://nuget.fast-report.com/api/v3/index.json;
- User - email от аккаунта Быстрые отчеты;
- Password - пароль от аккаунта Быстрые отчеты.

NuGet, а кликаем по вкладке Sources.

Форма для добавления репозитория NuGet

И вы увидите, что появился соответствующий репозиторий:

Добавлен репозиторий FastReport-NuGet

Сейчас мы установим пакет FastReport Core. Для этого переходим во вкладку Packages и фильтруем пакеты по репозиторию FastReport. И конечно же устанавливаем найденный пакет.

Установка NuGet-пакета FastReport.Core

Если все прошло успешно, то вы получите соответствующее уведомление.

Уведомление об успешной установке NuGet-пакета FastReport.Core

Далее создадим шаблон из кода, для этого сделаем следующие действия. Добавим в Program.cs:

using System.Drawing;
using FastReport;
using FastReport.Export.Pdf;

Затем ниже добавим CreateDataSet в Program.cs:

Report report = new Report();
CreateReportTemplate();
ExportToPDF();

После добавим функцию создания шаблона отчета CreateReportTemplate:

void CreateReportTemplate()
{
 // добавляем страницу отчета
 ReportPage page = new ReportPage();
 
 // создаем дата бэнд
 DataBand data = new DataBand();
 PageHeaderBand dataText = new PageHeaderBand();
 
 //создаем заголовок
 ReportTitleBand titleBand = new ReportTitleBand();
 TextObject employeeIdText = new TextObject();
 TextObject employeeNameText = new TextObject();
 TextObject idText = new TextObject();
 TextObject nameText = new TextObject();
 TextObject titleText = new TextObject();
 //регистрируем источник данных
 report.RegisterData(dataSet);
 //включаем таблицу данных
 report.GetDataSource("Сотрудники").Enabled = true;
 //добавляем в шаблон страницу
 report.Pages.Add(page);
 // добавляем на страницу: data,dataText, titleBand
 // и устанавливаем уникальное имя страницы
 page.AddChild(data);
 page.AddChild(dataText);
 page.AddChild(titleBand);
 page.CreateUniqueName();
 // устанавливаем уникальное имя titleBand
 // и выставляем настройки бэнда
 titleBand.CreateUniqueName();
 titleBand.Height = Units.Centimeters * 1.5f;
 titleText.Bounds = new RectangleF(300, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 titleText.Text = "Сотрудники";
 titleText.Font = new Font("Arial", 14, FontStyle.Bold);
 titleText.VertAlign = VertAlign.Center;
 
 // устанавливаем уникальное имя data
 // и выставляем настройки data
 data.CreateUniqueName();
 data.DataSource = report.GetDataSource("Сотрудники");
 data.Height = Units.Centimeters * 0.5f;
 
 // устанавливаем уникальное имя dataText
 // и выставляем настройки dataText
 dataText.CreateUniqueName();
 dataText.Height = Units.Centimeters * 0.8f;
 
 // устанавливаем уникальное имя employeeIdText
 // и выставляем настройки employeeIdText, idText
 employeeIdText.Parent = data;
 employeeIdText.CreateUniqueName();
 employeeIdText.Bounds = new RectangleF(0, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 idText.Bounds = new RectangleF(0, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 idText.Text = "ID";
 employeeIdText.Text = "[Сотрудники.ID]";
 
 // устанавливаем уникальное имя employeeNameText
 // и выставляем настройки employeeNameText, nameText
 employeeNameText.Parent = data;
 employeeNameText.CreateUniqueName();
 employeeNameText.Bounds = new RectangleF(50, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 nameText.Bounds = new RectangleF(50, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 nameText.Text = "Имя";
 employeeNameText.Text = "[Сотрудники.Имя]";
 
 // добавляем на бэнд data: employeeIdText, employeeNameText
 data.AddChild(employeeIdText);
 data.AddChild(employeeNameText);
 
 // добавляем на бэнд dataText: idText, nameText
 dataText.AddChild(idText);
 dataText.AddChild(nameText);
 
 // добавляем на бэнд titleBand: titleText
 titleBand.AddChild(titleText);
}

Далее добавим функцию создания шаблона отчета ExportToPDF и назовем экспорт отчета "Отчет.pdf":

void ExportToPDF()
{
 // запускаем отчет
 report.Prepare();
 // создаем экземпляр экспорта
 PDFExport export = new PDFExport();
 report.Export(export, "Отчет.pdf");
 // освобождаем ресурсы, используемые отчетом
 report.Dispose(); 
}

Запустим консольное приложение, если получен ответ Process finished with exit code 0, то вы сделали все верно. Далее откройте отчет в нашем случае по пути /home/alex/RiderProjects/ReportPDF_Core_ConsoleApp/ReportPDF_Core_ConsoleApp/bin/Debug/net6.0/Отчет.pdf:

Результат экспорта отчета в PDF

Таким образом мы получили простой отчет/документ формата PDF, построенный из набора данных.

В данной статье мы с вами рассмотрели связку JetBrains Rider (C#) + .NET Core + Console Application + FastReport .NET Core + Linux («Альт Рабочая станция К» 10) и получили отчет, построенный из набора данных в формате PDF. И конечно мы убедились, что платформу .NET можно легко использовать без Microsoft Visual Studio, так как в Linux ее просто нет.

Мы, конечно, не рассмотрели создание GUI приложения на Linux, что можно, например сделать с помощью фреймворка Mono, но на нашем сайте вы можете найти статьи как это сделать.

Полный листинг программы

using System.Data;
using System.Drawing;
using FastReport;
using FastReport.Export.Pdf;
using FastReport.Utils;
 
//создание объекта набора данных 
DataSet dataSet = new DataSet();
CreateDataSet();
//создание объекта отчета
Report report = new Report();
 
CreateReportTemplate();
ExportToPDF();
 
void CreateReportTemplate()
{
 // добавляем страницу отчета
 ReportPage page = new ReportPage();
 
 // создаем дата бэнд
 DataBand data = new DataBand();
 PageHeaderBand dataText = new PageHeaderBand();
 
 //создаем заголовок
 ReportTitleBand titleBand = new ReportTitleBand();
 TextObject employeeIdText = new TextObject();
 TextObject employeeNameText = new TextObject();
 TextObject idText = new TextObject();
 TextObject nameText = new TextObject();
 TextObject titleText = new TextObject();
 //регистрируем источник данных
 report.RegisterData(dataSet);
 //включаем таблицу данных
 report.GetDataSource("Сотрудники").Enabled = true;
 //добавляем в шаблон страницу
 report.Pages.Add(page);
 // добавляем на страницу: data,dataText, titleBand
 // и устанавливаем уникальное имя страницы
 page.AddChild(data);
 page.AddChild(dataText);
 page.AddChild(titleBand);
 page.CreateUniqueName();
 // устанавливаем уникальное имя titleBand
 // и выставляем настройки бэнда
 titleBand.CreateUniqueName();
 titleBand.Height = Units.Centimeters * 1.5f;
 titleText.Bounds = new RectangleF(300, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 titleText.Text = "Сотрудники";
 titleText.Font = new Font("Arial", 14, FontStyle.Bold);
 titleText.VertAlign = VertAlign.Center;
 
 // устанавливаем уникальное имя data
 // и выставляем настройки data
 data.CreateUniqueName();
 data.DataSource = report.GetDataSource("Сотрудники");
 data.Height = Units.Centimeters * 0.5f;
 
 // устанавливаем уникальное имя dataText
 // и выставляем настройки dataText
 dataText.CreateUniqueName();
 dataText.Height = Units.Centimeters * 0.8f;
 
 // устанавливаем уникальное имя employeeIdText
 // и выставляем настройки employeeIdText, idText
 employeeIdText.Parent = data;
 employeeIdText.CreateUniqueName();
 employeeIdText.Bounds = new RectangleF(0, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 idText.Bounds = new RectangleF(0, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 idText.Text = "ID";
 employeeIdText.Text = "[Сотрудники.ID]";
 
 // устанавливаем уникальное имя employeeNameText
 // и выставляем настройки employeeNameText, nameText
 employeeNameText.Parent = data;
 employeeNameText.CreateUniqueName();
 employeeNameText.Bounds = new RectangleF(50, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 nameText.Bounds = new RectangleF(50, 0, Units.Centimeters * 10, Units.Centimeters * 0.5f);
 nameText.Text = "Имя";
 employeeNameText.Text = "[Сотрудники.Имя]";
 
 // добавляем на бэнд data: employeeIdText, employeeNameText
 data.AddChild(employeeIdText);
 data.AddChild(employeeNameText);
 
 // добавляем на бэнд dataText: idText, nameText
 dataText.AddChild(idText);
 dataText.AddChild(nameText);
 
 // добавляем на бэнд titleBand: itleText
 titleBand.AddChild(titleText);
}
 
void ExportToPDF()
{
 report.Prepare();
 PDFExport export = new PDFExport();
 report.Export(export, "Отчет.pdf");
 report.Dispose(); 
}
 
void CreateDataSet()
{
 // создаем простой набор данных с помощью одной таблицы
 
 // создаем простой набор данных
 dataSet = new DataSet();
 
 // создаем таблицу
 DataTable table = new DataTable();
 table.TableName = "Сотрудники";
 // добавляем таблицу в набор данных
 dataSet.Tables.Add(table);
 
 // добавление данных в таблицу
 table.Columns.Add("ID", typeof(int));
 table.Columns.Add("Имя", typeof(string));
 table.Rows.Add(1, "Андрей Иванов");
 table.Rows.Add(2, "Николай Федоров");
 table.Rows.Add(3, "Александр Петров");
}