Загрузка данных


from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn

def set_tnr_14(element):
    """Принудительно устанавливает Times New Roman 14 пт для абзаца или ячейки таблицы"""
    for run in element.runs:
        run.font.name = 'Times New Roman'
        run.font.size = Pt(14)
        # Для корректного отображения кириллицы в некоторых версиях Word
        run._element.rPr.rFonts.set(qn('w:eastAsia'), 'Times New Roman')

def format_document(doc):
    """Применяет базовое форматирование ко всему документу"""
    style = doc.styles['Normal']
    style.font.name = 'Times New Roman'
    style.font.size = Pt(14)
    style._element.rPr.rFonts.set(qn('w:eastAsia'), 'Times New Roman')
    style.paragraph_format.line_spacing = 1.5

def add_formatted_heading(doc, text, level=1):
    """Добавляет заголовок с форматированием TNR 14, жирный"""
    p = doc.add_heading(text, level=level)
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    for run in p.runs:
        run.font.name = 'Times New Roman'
        run.font.size = Pt(14)
        run.font.bold = True
        run._element.rPr.rFonts.set(qn('w:eastAsia'), 'Times New Roman')
    return p

def add_formatted_table(doc, data, headers):
    """Создает таблицу и применяет к ней форматирование TNR 14"""
    table = doc.add_table(rows=1, cols=len(headers))
    table.style = 'Table Grid'
    
    # Заголовки
    hdr_cells = table.rows[0].cells
    for i, header in enumerate(headers):
        hdr_cells[i].text = header
        set_tnr_14(hdr_cells[i])
        # Делаем заголовок жирным
        for run in hdr_cells[i].paragraphs[0].runs:
            run.font.bold = True

    # Данные
    for row_data in data:
        row_cells = table.add_row().cells
        for i, cell_data in enumerate(row_data):
            row_cells[i].text = str(cell_data)
            set_tnr_14(row_cells[i])
            
    doc.add_paragraph() # Отступ после таблицы
    return table

# 1. Инициализация документа
doc = Document()
format_document(doc)

# === 1. ТИТУЛЬНЫЙ ЛИСТ ===
doc.add_paragraph("\n" * 3)
p = doc.add_paragraph('Министерство образования и науки\nДепартамент образования вашего региона\nНазвание вашего колледжа')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in p.runs: set_tnr_14(p)

doc.add_paragraph("\n" * 4)
p = doc.add_paragraph('ПРОЕКТНАЯ РАБОТА\nпо дисциплине «Управление проектами»\n\nна тему:\n«Создание локального сервиса печати и оперативной полиграфии «Копирка-Campus»')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in p.runs:
    set_tnr_14(p)
    run.font.bold = True

doc.add_paragraph("\n" * 4)
p = doc.add_paragraph('Выполнил: студент группы ХХ-ХХ\nИванов И.И.\nПроверил: Петров П.П.')
p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
for run in p.runs: set_tnr_14(p)

doc.add_paragraph("\n" * 2)
p = doc.add_paragraph('Город, 2026 г.')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in p.runs: set_tnr_14(p)

doc.add_page_break()

# === 2. СОДЕРЖАНИЕ ===
add_formatted_heading(doc, 'СОДЕРЖАНИЕ', level=1)
toc_data = [
    "Введение ................................................................................................................... 3",
    "Глава 1. Теоретико-концептуальное обоснование проекта ................................ 4",
    "  1.1. Дерево целей и задач .................................................................................... 4",
    "  1.2. Анализ заинтересованных сторон (Stakeholders) ....................................... 5",
    "  1.3. SWOT-анализ проекта ................................................................................... 6",
    "Глава 2. Организационно-управленческий план проекта ................................... 7",
    "  2.1. Иерархическая структура работ (ИСР/WBS) .............................................. 7",
    "  2.2. Календарно-сетевое планирование (Данные для диаграммы Ганта) ....... 8",
    "  2.3. Матрица ответственности (RACI) ............................................................... 9",
    "  2.4. Бюджет проекта (Смета) ............................................................................ 10",
    "  2.5. Реестр рисков .............................................................................................. 11",
    "  2.6. Коммуникационный план ........................................................................... 12",
    "Заключение ............................................................................................................ 13",
    "Список использованных источников ................................................................... 14",
    "Приложения ........................................................................................................... 15"
]
for item in toc_data:
    p = doc.add_paragraph(item)
    set_tnr_14(p)

doc.add_page_break()

# === 3. ВВЕДЕНИЕ ===
add_formatted_heading(doc, 'ВВЕДЕНИЕ', level=1)
intro_text = [
    "1. Актуальность: В современном учебном процессе студентам и преподавателям постоянно требуется оперативная печать конспектов, курсовых работ и раздаточных материалов. Существующие решения в городе находятся за пределами кампуса, что отнимает время, а библиотечный принтер не справляется с потоком и часто ломается. Создание точки внутри колледжа решит проблему доступности и скорости.",
    "2. Цель проекта: Запустить функционирующий сервис оперативной полиграфии «Копирка-Campus» на базе библиотеки колледжа к 01.02.2027 года с окупаемостью в течение 6 месяцев.",
    "3. Задачи проекта: 1) Изучить спрос и ценовую политику конкурентов; 2) Согласовать размещение оборудования с администрацией библиотеки; 3) Закупить МФУ и расходные материалы; 4) Нанять и обучить 2-х студентов-операторов; 5) Запустить рекламную кампанию в чатах групп.",
    "4. Объект и предмет исследования: Объект — процесс организации сервиса оперативной полиграфии в учебном заведении. Предмет — методы планирования ресурсов, сроков и бюджета данного проекта без использования специализированного ПО.",
    "5. Сроки выполнения: Начало проекта — 01.11.2026. Окончание проекта (запуск) — 01.02.2027. Общий срок: 3 месяца."
]
for text in intro_text:
    p = doc.add_paragraph(text)
    set_tnr_14(p)

doc.add_page_break()

# === ГЛАВА 1 ===
add_formatted_heading(doc, 'ГЛАВА 1. ТЕОРЕТИКО-КОНЦЕПТУАЛЬНОЕ ОБОСНОВАНИЕ ПРОЕКТА', level=1)

add_formatted_heading(doc, '1.1. Дерево целей и задач', level=2)
p = doc.add_paragraph('1. Запустить сервис «Копирка-Campus»\n    1.1. Подготовить документацию\n        1.1.1. Составить бизнес-план и смету\n        1.1.2. Согласовать размещение с администрацией библиотеки\n    1.2. Обеспечить техническую базу\n        1.2.1. Выбрать и закупить МФУ и бумагу\n        1.2.2. Организовать рабочее место оператора\n    1.3. Обеспечить кадровый ресурс\n        1.3.1. Провести отбор студентов-операторов\n        1.3.2. Провести инструктаж по технике безопасности')
set_tnr_14(p)

add_formatted_heading(doc, '1.2. Анализ заинтересованных сторон (Stakeholders)', level=2)
stakeholders_headers = ['Заинтересованная сторона', 'Интересы / Выгоды', 'Возможные риски', 'Стратегия взаимодействия']
stakeholders_data = [
    ['Студенты', 'Дешевая и быстрая печать рядом с аудиторией', 'Очереди в перерывах', 'Введение системы предзаказа через Telegram'],
    ['Администрация колледжа', 'Доп. сервис для студентов, имидж инновационности', 'Нарушение пожарной безопасности', 'Регулярные отчеты, строгое соблюдение ТБ'],
    ['Сотрудники библиотеки', 'Отсутствие лишней нагрузки на их технику', 'Шум, пыль от картриджей', 'Выделение изолированного угла, регулярная уборка']
]
add_formatted_table(doc, stakeholders_data, stakeholders_headers)

add_formatted_heading(doc, '1.3. SWOT-анализ проекта', level=2)
swot_headers = ['Внутренняя среда', 'Внешняя среда']
swot_data = [
    ['S (Сильные стороны):\n- Низкая аренда (льготная от колледжа)\n- Понимание потребностей целевой аудитории', 'O (Возможности):\n- Партнерство с местной типографией для сложных заказов\n- Расширение ассортимента (ламинация, переплет)'],