Skip to content

v-suyarov/Report_release

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Содержание:

  • 1. Мотивация
  • 2. В чем идея
  • 3. Разбор примера

1. Мотивация

Задача написать отчет эксель, наверное, самая частая у нас в команде.
Для написания отчета обычно мы используем xlsxwriter и csv.
Если с csv логика формирования отчета довольно проста, то с xlsxwriter можно строить довольно сложные отчеты и логика формирования отчета в таком случае может быть довольно большой и запутанной и что более важно, для каждого существующего скрипта логика формирования отчета скорее всего будет разная.
Данная библиотека по задумке может использоваться, как ресурс для скриптов, это позволит привести логику формирования отчетов к единому формату.

2. В чем идея

Основная идея в том, чтобы избавиться от явной записи каждой ячейки. Это достигается тем, что отчет строится на основе контейнеров. Контейнер можно воспринимать, как абстрактный объект, который знает, какие объекты он хранит и какие у них размеры (мерж размеры). Контейнер может хранить, как другие контейнеры, так и ячейки. Контейнеры бывают двух видов, Row и Column. Row означает, что все элементы этого контейнера, расположены горизонтально. Соответственно в Column все элементы расположены вертикально.
Так как контейнеры могут содержать другие контейнеры, это позволяет формировать сетку любого вида. В последствии на основе этой сетки и записывается отчет в эксель.

3. Разбор примера


В примере (в файле main.py), показан способ создания xlsx отчета.
Перед тем, как перейти к коду посмотрим на итоговый отчет, который генерирует скрипт. Сейчас нам интересно только на него посмотреть, а пригодится он позже.

example_xlsx.png


Весь код примера содержится в функции main.
В самом начале создаются workbook и worksheet, для работы с xlsx.

example_main.png


Далее метод _get_cell_formats определяет форматы для заголовков и значений

example_get_cell_formats.png


Полученные форматы передаются в ключевую функцию всего примера - get_report, который и создает отчет, который видели выше.


Начнем с нескольких первых строк.

example_get_report.png

Здесь создаются объекты grade и full_name типа Column. Это значит, что все элементы, которые содержат эти объекты буду расположены вертикально. Мы также можем увидеть, как выглядят эти объекты в самом отчете.

example_grade.png

example_full_name.png

В данном примере наши объекты содержат только объекты типа Text.
В Text передается значение, которое будет содержать ячейка, также передается объект Merged, который определяет, стоит ли объединять ячейки и как объединять, ну и последним аргументом передается формат ячейки типа Format.
Для примера посмотрим еще на объект типа Row.

example_supervisor.png

example_supervisor_xlsx.png

Далее создается еще несколько контейнеров и в конечном счете формируется "сетка" отчета.

example_grid.png

Что собственно здесь происходит, на самом деле отчет является типом Column, значит все элементы в нем расположены вертикально, и сопоставив код и отчет мы можем явно увидеть эти элементы.

example_grid_1.png

Далее можно углубиться на второй уровень вложенности, насмотрим элемент под номером 1. Он по своей сути является объектом Row. В нем прослеживаются следующие элементы.

example_grid_2.png

В итоге углублять можно до тех пор, пока не дойдем до конкретной ячейки. Таким образом комбинируя Row и Column можно добиться любой сетки.

В конце концов get_report возвращает контейнер (сетку), который далее передается во writer.write, в итоге в этом методе врайтер проитерируется по всем ячейкам контейнера и запишет их в эксель.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages