В этой статье мы взглянем на мир платформы .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».
Следом идёт настройка проекта. Выбираем тип проекта 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.
Теперь добавляем новый репозиторий с помощью нажатия на «+» и вносим необходимые данные:
- Name - имя источника без пробелов (например FastReport);
- URL - https://nuget.fast-report.com/api/v3/index.json;
- User - email от аккаунта Быстрые отчеты;
- Password - пароль от аккаунта Быстрые отчеты.
NuGet, а кликаем по вкладке Sources.
И вы увидите, что появился соответствующий репозиторий:
Сейчас мы установим пакет FastReport Core. Для этого переходим во вкладку Packages и фильтруем пакеты по репозиторию FastReport. И конечно же устанавливаем найденный пакет.
Если все прошло успешно, то вы получите соответствующее уведомление.
Далее создадим шаблон из кода, для этого сделаем следующие действия. Добавим в 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, построенный из набора данных.
В данной статье мы с вами рассмотрели связку 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, "Александр Петров"); }