Генератор отчетов на C# - Часть 1 (Постановка задачи и Внешний интерфейс)

По работе мне часто приходится делать всевозможные выборки и отчеты на основе имеющихся данных в таблицах Excel. Как правило, в условиях срочности, лучший вариант - "на коленке" склепать макрос на VBA для Excel. Макросы и были придуманы как раз для подобного рода задач. Однако, когда задача становится регулярной (однотипный отчет раз в неделю, меняются лишь цифры, структура документа остается прежней), стоит задуматься над более комфортным способом создания таких отчетов. В этом проекте я бы хотел показать то, как можно подойти к решению одной из таких задач.



Ситуация: Один раз в неделю присылаются выгрузки базы различных организаций в формате *.xlsx. Структура документов одинаковая: название организации, ее ОГРН, данные (предоставленные организацией в базу) за период с 2000 по 2018 год, а также общая колонка с суммой предоставленных данных за все годы.

Задача: Используя ОГРН, определить район области, к которому принадлежит организация. Сделать анализ присланных данных: выявить количество заполнивших информацию за все годы, не заполнивших вовсе, заполнивших частично и общее количество организаций, все это с привязкой к конкретному району области. Сохранить полученные 2 таблицы в формат XLS.

Дополнительные требования: Программой должны суметь воспользоваться люди, не имеющие специальных навыков (уверенные пользователи ПК). Программа не должна зависеть от версии установленного MS Office и наличия MS Office на компьютере пользователя.

Как я говорил ранее, быстрее всего - написать простые макросы в Excel, но у C# будет ряд преимуществ:
  • Адекватный внешний интерфейс - позволит любому рядовому пользователю в пару кликов собрать необходимый отчет, без необходимости уметь работать с макросами.
  • Кроссплатформенность. Нет гарантии, что макрос не выдаст ошибку на другой машине (даже при установленном офисе того же года, а у нас в организации даже офисы разных лет). В нашем же приложении привязка осуществляется к Net Framework, который есть на всех компьютерах, а не к MS Office (при желании его вовсе может и не быть на компьютере пользователя).
  • Скорость. Как показала практика, средствами C# требуемый отчет можно создать за 20 секунд. При помощи VBA мне удавалось это сделать лишь за 2 минуты (учитывая все производимые операции, а не только работу макроса).
Исходя из требований, функционал программы определен следующий:
  1. Загрузка базы данных ОГРН (CSV) - Для базы данных ОГРН был выбран формат CSV, так как для его редактирования достаточно обычного блокнота и дописать в нее данные при наличии "неизвестных" ОГРН не составит труда.
  2. Выбор файла выгрузки (XLSX) - Для открытия файлов формата XLSX была выбрана сторонняя библиотека ExcelDataReader.
  3. Создание отчета
  4. Сохранение отчета (XLS) - Для сохранения результатов расчетов в формат XLS была выбрана сторонняя библиотека ExcelLibrary.
Сразу оговорюсь, что чтение и сохранение Excel-файлов можно реализовать одной библиотекой (NPOI, например), но в этом проекте я решил воспользоваться уже знакомыми и использующимися мною библиотеками.

Внешний интерфейс


Для формы я подобрал следующие элементы:
  • GroupBox (2 шт.)
  • Label (1 шт.)
  • TextBox (2 шт.)
  • TabControl (1 шт.) - TabPages (5 шт.)
  • DataGridView (4 шт.)
  • Button (4 шт.)
  • ProgressBar
  • ImageList
Первый TextBox будет использоваться для отображения пути к файлу выгрузки, а также при изменении его значения, по указанному в свойстве Text пути приложение будет загружать выгрузку в DataGridView для дальнейшей обработки. Поэтому свойство ReadOnly устанавливаем в положение True.

Второй TextBox имеет свойство MultiLine = True и будет использоваться для записи отчета о работе самого приложения. В случае обнаружения каких-либо проблем (будь то подгрузка базы, или отсутствие в ней какого-либо ОГРН) - в логах обязательно это отобразится и сам пользователь (либо технический специалист) сможет понять в чем проблема и исправить её. Так же из этого TextBox отчет будет перезаписываться в корневую папку приложения (каждую сессию).

TabControl. Страницы названы следующим образом: База ОГРН, Файл выгрузки, Обработка выгрузки, Сводные данные (Отчет), Сессия. Внутри последней вкладки располагается второй TextBox, во всех остальных DataGridView.

Buttons потребуются для выбора файла выгрузки, создания отчета, сохранения отчета и справки о программе. Для кнопок были заданы соответствующие их функциям изображения.

ProgressBar необходим для отслеживания этапов открытия/обработки/сохранения выгрузки и отчета.

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

ImageList был добавлен для возможности задать вкладкам в TabControl индивидуальные изображения.

Так же была добавлена форма с информацией о программе (Добавить форму - Форма "О программе"). Содержимое редактируется через Свойства проекта - Сведения о сборке.

На этом этапы постановки задачи и разработки внешнего интерфейса завершены. В следующей части будет написан код для выполнения поставленных задач. Спасибо за внимание!