Добавлен генератор PDF отчетов с графиками и поддержкой кириллицы

- Создан create_pdf_report.py для генерации PDF отчётов
- Поддержка кириллицы через DejaVu Sans шрифты
- 3 типа графиков: распределение по баллам, топ-10 критериев, общая статистика
- Отчёт для Орловской области: 259KB, 5 страниц
- Обновлен create_horizontal_report.py
This commit is contained in:
Фёдор
2025-10-28 00:33:33 +03:00
parent 5e807fd7ce
commit 54e2206234
3 changed files with 904 additions and 28 deletions

View File

@@ -294,55 +294,61 @@ def create_dashboard_sheet(workbook, audit_data, criteria_stats):
ws.cell(row=current_row, column=col).font = normal_font
ws.cell(row=current_row, column=col).alignment = Alignment(horizontal='center')
# Графики
# Круговой график статуса сайтов
# Графики с динамическими ссылками
# 1. Круговой график - распределение отелей по статусу
pie_chart = PieChart()
pie_chart.title = "Статус сайтов отелей"
# Данные для пирога: Сайты доступны (4), Сайты недоступны (0), Без сайтов (8), В реестре РКН (10)
pie_data = Reference(ws, min_col=2, min_row=14, max_row=17, max_col=2)
pie_labels = Reference(ws, min_col=1, min_row=14, max_row=17, max_col=1)
pie_chart.add_data(pie_data, titles_from_data=False)
pie_chart.set_categories(pie_labels)
pie_chart.title = "Распределение по баллам соответствия"
pie_chart.height = 10
pie_chart.width = 15
# Добавляем подписи данных
# Данные для пирога из таблицы распределения по баллам
pie_data = Reference(ws, min_col=2, min_row=score_header_row+1, max_row=score_data_start+len(score_ranges)-1, max_col=2)
pie_labels = Reference(ws, min_col=1, min_row=score_header_row+1, max_row=score_data_start+len(score_ranges)-1)
pie_chart.add_data(pie_data, titles_from_data=False)
pie_chart.set_categories(pie_labels)
# Подписи данных
pie_chart.dataLabels = DataLabelList()
pie_chart.dataLabels.showPercent = True
pie_chart.dataLabels.showCategoryName = True
ws.add_chart(pie_chart, "C3")
# Добавляем график справа от статистики
ws.add_chart(pie_chart, "J3")
# Столбчатый график по критериям
# 2. Столбчатый график - результаты по критериям (топ-10)
chart1 = BarChart()
chart1.title = "Результаты по критериям"
chart1.title = "Топ-10 критериев (найдено / не найдено)"
chart1.x_axis.title = "Критерии"
chart1.y_axis.title = "Количество отелей"
data = Reference(ws, min_col=2, min_row=20, max_row=20+len(criteria_stats), max_col=3)
cats = Reference(ws, min_col=1, min_row=21, max_row=20+len(criteria_stats))
chart1.add_data(data, titles_from_data=False)
chart1.set_categories(cats)
chart1.height = 10
chart1.height = 12
chart1.width = 20
ws.add_chart(chart1, "C20")
# Берем топ-10 критериев
top_n = min(10, len(criteria_stats))
# График распределения по баллам
data = Reference(ws, min_col=2, min_row=data_start_row, max_row=data_start_row+top_n-1, max_col=3)
cats = Reference(ws, min_col=1, min_row=data_start_row, max_row=data_start_row+top_n-1)
chart1.add_data(data, titles_from_data=False)
chart1.set_categories(cats)
# Добавляем график справа от таблицы критериев
ws.add_chart(chart1, "J20")
# 3. Столбчатый график распределения по баллам
chart2 = BarChart()
chart2.title = "Распределение по баллам"
chart2.title = "Распределение отелей по баллам"
chart2.x_axis.title = "Диапазон баллов"
chart2.y_axis.title = "Количество отелей"
data2 = Reference(ws, min_col=2, min_row=41, max_row=41+len(score_ranges), max_col=2)
cats2 = Reference(ws, min_col=1, min_row=42, max_row=41+len(score_ranges))
chart2.add_data(data2, titles_from_data=False)
chart2.set_categories(cats2)
chart2.height = 8
chart2.width = 12
ws.add_chart(chart2, "C40")
data2 = Reference(ws, min_col=2, min_row=score_header_row+1, max_row=score_data_start+len(score_ranges)-1, max_col=2)
cats2 = Reference(ws, min_col=1, min_row=score_header_row+1, max_row=score_data_start+len(score_ranges)-1)
chart2.add_data(data2, titles_from_data=False)
chart2.set_categories(cats2)
# Добавляем график рядом с таблицей распределения
ws.add_chart(chart2, "J40")
# Настройка ширины колонок
column_widths = [30, 10, 10]