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