✨ Добавлен генератор PDF отчетов с графиками и поддержкой кириллицы
- Создан create_pdf_report.py для генерации PDF отчётов - Поддержка кириллицы через DejaVu Sans шрифты - 3 типа графиков: распределение по баллам, топ-10 критериев, общая статистика - Отчёт для Орловской области: 259KB, 5 страниц - Обновлен create_horizontal_report.py
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user