Оглавление:

Проблема ухода DX и потери инструмента для создания отчетов

Всем привет! Меня зовут Леонид, я разработчик компании DD Planet.

Как мы все прекрасно понимаем, ни один бизнес-проект немыслим без разного рода отчетов. Быстрота и удобство их создания зачастую критично важны.

В нашей компании мы долгое время использовали инструмент DevExpress Reports. Однако после ухода DX с отечественного рынка остро встал вопрос о пересмотре архитектуры формирования отчетов - особенно тех, что создавались с помощью визуального дизайнера форм.

Раньше, при использовании компонентов DevExpress, такие отчеты можно было создать в несколько кликов и практически без знания кода - за счет мощного и удобного дизайнера:

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

Прежде всего отметим, что наиболее востребованных типов отчетов существует два: Excel и PDF. Далее рассмотрим существующие решения по каждому из них.

Кра��кий обзор лицензионных альтернатив для создания отчетов

Сначала кратко перечислим возможные платные альтернативы для создания отчетов:

  • FastReports — мощный инструмент для генерации отчетов, поддерживает разные платформы (Web, WinForms, WPF и др.) — Официальный сайт

  • StimulSoft — генератор отчетов под ASP.NET,.NET Core, JS, Angular, Blazor, PhP и др. — Официальный сайт

  • Telerik UI for.NET (Community Edition) — содержит некоторые компоненты для экспорта, в том числе PDF. Официальный сайт

  • Microsoft RDLC Report Designer — дизайнер отчетов от Microsoft, является бесплатным, но для полноценного использования все равно потребуется лицензионная версия VisualStudio — Microsoft marketplace

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

Альтернативы для создания отчетов Excel

Существует несколько бесплатных библиотек, которые позволяют работать с Excel в .NET - импортировать и экспортировать данные, менять их и т.п.:

  • NPOI - отличная альтернатива для работы с XLSX/XLS без установки Office. Плюсы:

    • Хорошо справляется с объемами данных в сотни тысяч строк;

    • Имеет понятный API, с помощью которого можно, например, получить информацию об иерархичности документа, стилях ячеек и т. д;

    • Поддержка старых версий Excel.

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

Однако с созданием простых задач библиотека справляется хорошо. Я использовал ее на одном из проектов для экспорта данных и создания типовых отчетов.  GitHub репозиторий

  • DocumentFormat.OpenXml - низкоуровневая, но мощная библиотека от Microsoft. По характеристикам близка к NPOI, хорошо работает с сопоставимыми объемами данных, но могут быть проблемы при импорте из файлов старых версий Excel - GitHub репозиторий

  • ClosedXml - простая и удобная обертка над OpenXml SDK - GitHub репозиторий. Эту библиотеку мы использовали на одном из проектов, где нужно было обработать файлы разной структуры.

  • LibreOffice - мощный офисный пакет, полностью совместимый с 32/64-битными системами. Переведен более чем на 30 языков мира. Основной плюс - кроссплатформенность: поддерживает большинство популярных операционных систем, включая GNU/Linux, Microsoft Windows и Mac OS X.

Все эти примеры - то, чем можно пользоваться бесплатно. Есть и более мощные инструменты, например, Aspose, который позволяет создавать отчеты практически любой сложности, но он требует коммерческую лицензию, а в настоящее время на территории РФ нет возможности оплачивать иностранное ПО.

Сравнительные характеристики, основные плюсы и минусы этих библиотек для наглядности приведем в виде таблицы, с нашей субъективной оценкой каждого показателя по шкале от 0 до 5 и с признаком OpenSource (да/нет):

Название библиотеки

Работа с большими объемами данных

Простое и понятное API

Поддержка старых версий Excel

Возможности по кастомизации шаблона документа

OpenSource

NPOI

5

5

5

3

да

OpenXml

5

5

3

3

да

ClosedXml

5

5

3

3

да

LibreOffice

5

4

5

3

да

Aspose

5

5

5

5

нет

Альтернативы для создания отчетов PDF

Здесь также есть выбор бесплатных библиотек, которые закрывают основные потребности в создании отчетов:

  • iText7 - мощная библиотека с широкими возможностями, однако требует внимания к лицензированию (есть AGPL). GitHub репозиторий

  • QuestPDF - современная и простая в использовании библиотека с открытым исходным кодом. GitHub репозиторий

  • DinkToPdf - обертка над wkhtmltopdf, позволяет генерировать PDF из HTML. GitHub репозиторий

  • PuppeteerSharp - бесплатная библиотека, предоставляющая API для контроля браузера. Может быть использована для преобразования HTML-текста в PDF.  GitHub репозиторий

Пример создания PDF-отчета

Остановимся подробнее на PuppeteerSharp и рассмотрим, как на практике можно создать PDF-отчет с его помощью. Задача по сути разбивается на 2 этапа - сначала нам необходимо сгенерировать HTML-документ, а затем конвертировать его в PDF-файл.

Для решения первой задачи хорошо подходит технология SSR (Server-Side Rendering). Она позволяет генерировать HTML-код страницы на сервере при запросе пользователя. Реализация SSR с React и Node.js включает создание серверного кода на Express, который использует ReactDOMServer.renderToString() для преобразования React-компонента в HTML-строку, а затем вставляет ее в шаблон страницы:

// server.js
const express = require('express');
const ReactDOMServer = require('react-dom/server');
const App = require('./src/App'); // Ваш React-компонент

const app = express();

app.get('/', (req, res) => {
  const appString = ReactDOMServer.renderToString(<App />); // Рендер в строку

  res.send(`
    <!DOCTYPE html>
    <html>
    <head>
      <title>Мое SSR приложение</title>
    </head>
    <body>
      <div id="root">${appString}</div>
    </body>
    </html>
  `);
});

app.listen(3000, () => console.log('Сервер запущен на порту 3000'));

Далее необходимо конвертировать ее в PDF-формат, т.е. создать сам отчет. Здесь нам поможет PuppeteerSharp. Вот простейший пример преобразования html to pdf:

using System;
using System.Threading.Tasks;
using PuppeteerSharp;

public class HtmlToPdfConverter
{
   public async Task ConvertHtmlToPdf(string htmlContent, string outputPdfPath)
   {
       // Скачивает браузер Chromium, если он еще не скачан
        await new BrowserFetcher().DownloadAsync();

       using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions
       {
         Headless = true // Запуск в "безголовом" режиме (без видимого окна браузера)
        }))
        {
            using (var page = await browser.NewPageAsync())
           {
               // Устанавливает HTML-контент на страницу
               await page.SetContentAsync(htmlContent);

                // Генерирует PDF из текущей страницы
              await page.PdfAsync(outputPdfPath, new PdfOptions
              {
                    Format = PaperFormat.A4, // Формат бумаги A4
                 PrintBackground = true // Печатать фоновые цвета и изображения
               });
           }
        }

        Console.WriteLine($"PDF файл успешно создан: {outputPdfPath}");
    }

    public static async Task Main(string[] args)
    {
        var converter = new HtmlToPdfConverter();
       string htmlToConvert = "<h1>Привет, мир!</h1><p>Это пример конвертации HTML в PDF с помощью PuppeteerSharp.</p>";
      string outputFilePath = "output.pdf";

     await converter.ConvertHtmlToPdf(htmlToConvert, outputFilePath);
   }
}

Заключение

Как видно из обзора, есть достаточное количество инструментов, которые позволяют воспроизвести основные функции DevExpress по экспорту отчетов, сохраняя при этом полный контроль над процессом. Единственная безальтернативная по сути вещь - визуальный дизайнер. Но его потеря это не повод рвать на себе волосы, как уже было сказано в начале - мы адаптировались к новым реалиям через новые процессы, подходы и решения. Отчеты по-прежнему создаются качественно, масштабируемо и с контролем версий, пусть и с иной степенью вовлечения разработчиков. Во многом теперь требуется более глубокое погружение в код, чуть больше трудозатрат - опять-таки ввиду отсутствия дизайнера. С другой стороны, потребность в квалифицированных разработчиках была и раньше: при работе с дизайнером тоже порой приходилось долго разбираться, как устроен компонент и какие опции он предоставляет. Сейчас потребность в разработчике остается актуальной, так что в этом плане мало что поменялось.