Разработка внутреннего портала для биотехнологической компании
Разработали внутреннюю мини-библиотеку на C# для автоматического преобразования Excel-файлов в C#-модели. Вместо ручного написания логики чтения каждой колонки разработчику достаточно было описать соответствие колонок модели с помощью атрибутов. Библиотека автоматически определяла нужные колонки, преобразовывала значения к типам свойств и формировала готовую коллекцию моделей.
Клиент
Биотехнологическая компания.
Задача
Бизнес-задача:
В нескольких сервисах внутреннего портала требовалось регулярно импортировать данные из Excel. При каждом новом сценарии разработчикам приходилось заново реализовывать схожую логику обработки файлов, что увеличивало трудозатраты и усложняло поддержку.
Задача разработки:
Устранить дублирование кода и создать единый переиспользуемый механизм импорта Excel. Требовалось, чтобы для подключения нового сценария достаточно было описать C#-модель и сопоставить ее поля с колонками файла через атрибуты.
Решение
Разработчик проанализировал существующую реализацию импорта Excel в нескольких сервисах и выделил общую логику.
Спроектировал программный интерфейс (API) библиотеки на основе атрибутов, например [ExcelColumn("Название колонки")], и реализовал механизм сопоставления колонок Excel со свойствами C#-модели.
Затем добавил автоматическое преобразование основных типов: string, числовые типы, DateTime, DateOnly, enum, nullable-типы и т.д. Также реализовал обработку обязательных и необязательных колонок, пустых ячеек и ошибок преобразования.
Добавил возможность пользовательского преобразования значений. Реализовал поддержку нескольких листов Excel.
Провел интеграцию библиотеки с несколькими существующими сервисами.
В качестве основы использовал ClosedXML, который уже применялся в проектах.
Вся первая рабочая версия библиотеки была реализована примерно за один рабочий день.
Результат
-
Устранили дублирование логики импорта Excel в нескольких сервисах.
-
Создали единый переиспользуемый механизм для новых сценариев импорта.
-
Сократили время добавления нового импорта с нескольких дней до нескольких часов. По оценке команды, каждый последующий импорт экономил около 4–8 часов разработки.
-
Снизили количество ошибок при чтении ячеек и преобразовании типов.
-
Упростили бизнес-логику: разработчику достаточно описать модель и атрибуты.
-
Внедрили решение в нескольких сервисах внутреннего портала и стали применять его как внутренний переиспользуемый инструмент.
Бизнес-эффект
Основной бизнес-эффект — снижение трудозатрат команды разработки и ускорение реализации новых сценариев импорта Excel.
-
Время разработки нового импорта сократилось примерно с 1–2 рабочих дней до нескольких часов.
-
При каждом последующем использовании библиотеки экономилось в среднем 4–8 часов разработки.
-
Единая реализация снизила количество ошибок в логике импорта и преобразования данных.
-
Библиотека использовалась в нескольких сервисах, поэтому эффект распространялся на несколько команд и проектов.
-
Окупаемость: если считать вложением один день разработки библиотеки, то затраты на ее создание окупались уже после нескольких новых импортов. При условной экономии 6 часов на каждом импорте — примерно после двух использований.
Трудности
Основная сложность заключалась не в чтении Excel, а в создании универсального механизма преобразования данных.
Особое внимание уделили:
-
автоматическому определению и преобразованию типов свойств;
-
корректной обработке nullable-типов и пустых ячеек;
-
преобразованию enum и дат из разных форматов;
-
понятной обработке ошибок с указанием строки и колонки, где возникла проблема;
-
разделению обязательных и необязательных колонок;
-
проектированию интерфейса библиотеки так, чтобы для простого импорта требовался минимум кода;
-
возможности расширять библиотеку без изменения уже существующего кода.
Технологии
-
C# / .NET
-
ClosedXML — работа с Excel-файлами
-
Reflection — анализ атрибутов и свойств C#-моделей
-
Custom Attributes — описание соответствия колонок Excel свойствам модели
-
Generics — универсальный API парсинга различных моделей
-
xUnit — модульное тестирование библиотеки