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


import openpyxl
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
from openpyxl.utils import get_column_letter

# ==================== ДАННЫЕ ПО НЕДЕЛЯМ ====================
data = {
    1: [  # Тяжёлая неделя
        ("ПН", "Бабочка", "Предутомление груди", 2, "10-12", 7),
        ("ПН", "Жим гантелей лёжа", "База грудь", 4, "6-8", "8-9"),
        ("ПН", "Брусья с весом", "База грудь/трицепс", 3, "6-8", 9),
        ("ПН", "Жим гантелей сидя", "База плечи", 3, "8-10", 8),
        ("ПН", "Махи в стороны", "Изоляция средняя дельта", 3, "12-15", 8),
        ("ПН", "Трицепс в тренажёре", "Изоляция трицепс", 3, "10-12", 8),
        ("ПН", "Французский жим лёжа", "Изоляция трицепс", 3, "10-12", 8),
        ("СР", "Пуловер", "Предутомление спины", 3, "12-15", 7),
        ("СР", "Подтягивания с весом", "База спина", 4, "6-8", "8-9"),
        ("СР", "Тяга штанги в наклоне", "База спина", 4, "6-8", 9),
        ("СР", "Подъём штанги на бицепс стоя", "База бицепс", 3, "8-10", 8),
        ("СР", "Молотковые сгибания", "Изоляция бицепс", 3, "10-12", 8),
        ("СР", "Разведения в наклоне", "Изоляция задняя дельта", 3, "12-15", 8),
        ("СР", "Скамья Скотта", "Добивка бицепс", 2, "10-12", 9),
        ("ПТ", "Разгибания ног сидя", "Предутомление квадрицепс", 3, "12-15", 7),
        ("ПТ", "Приседания со штангой", "База ноги", 4, "6-8", 9),
        ("ПТ", "Румынская тяга", "База бицепс бедра", 4, "8-10", 8),
        ("ПТ", "Жим гантелей сидя", "База плечи", 3, "8-10", 8),
        ("ПТ", "Суперсет: махи + разведения", "Изоляция плечи", 3, "12-15", 8),
        ("ПТ", "Сгибания ног сидя", "Изоляция бицепс бедра", 3, "10-12", 8),
        ("ПТ", "Подъёмы на носки стоя", "Изоляция икры", 4, "15-20", "8-9"),
        ("ПТ", "Разгибания с канатом", "Добивка трицепс", 2, "12-15", 8),
        ("ПТ", "Концентрированные сгибания", "Добивка бицепс", 2, "10-12", 8),
    ],
    2: [  # Средняя неделя
        ("ПН", "Бабочка", "Предутомление груди", 2, "12-15", 6),
        ("ПН", "Жим гантелей лёжа", "База грудь", 4, "8-10", 8),
        ("ПН", "Брусья с весом", "База грудь/трицепс", 3, "8-10", 8),
        ("ПН", "Жим гантелей сидя", "База плечи", 3, "10-12", "7-8"),
        ("ПН", "Махи в стороны", "Изоляция средняя дельта", 3, "14-17", "7-8"),
        ("ПН", "Трицепс в тренажёре", "Изоляция трицепс", 3, "12-15", "7-8"),
        ("ПН", "Французский жим лёжа", "Изоляция трицепс", 3, "12-15", "7-8"),
        ("СР", "Пуловер", "Предутомление спины", 3, "15-18", 6),
        ("СР", "Подтягивания с весом", "База спина", 4, "8-10", 8),
        ("СР", "Тяга штанги в наклоне", "База спина", 4, "8-10", 8),
        ("СР", "Подъём штанги на бицепс стоя", "База бицепс", 3, "10-12", "7-8"),
        ("СР", "Молотковые сгибания", "Изоляция бицепс", 3, "12-15", "7-8"),
        ("СР", "Разведения в наклоне", "Изоляция задняя дельта", 3, "15-18", "7-8"),
        ("СР", "Скамья Скотта", "Добивка бицепс", 2, "12-15", 8),
        ("ПТ", "Разгибания ног сидя", "Предутомление квадрицепс", 3, "15-18", 6),
        ("ПТ", "Приседания со штангой", "База ноги", 4, "8-10", 8),
        ("ПТ", "Румынская тяга", "База бицепс бедра", 4, "10-12", "7-8"),
        ("ПТ", "Жим гантелей сидя", "База плечи", 3, "10-12", "7-8"),
        ("ПТ", "Суперсет: махи + разведения", "Изоляция плечи", 3, "15-18", "7-8"),
        ("ПТ", "Сгибания ног сидя", "Изоляция бицепс бедра", 3, "12-15", "7-8"),
        ("ПТ", "Подъёмы на носки стоя", "Изоляция икры", 4, "18-22", "7-8"),
        ("ПТ", "Разгибания с канатом", "Добивка трицепс", 2, "15-18", 7),
        ("ПТ", "Концентрированные сгибания", "Добивка бицепс", 2, "12-15", 7),
    ],
    3: [  # Лёгкая неделя
        ("ПН", "Бабочка", "Предутомление груди", 2, "15-18", 5),
        ("ПН", "Жим гантелей лёжа", "База грудь", 3, "10-12", 6),
        ("ПН", "Брусья без веса", "База грудь/трицепс", 3, "10-12", "5-6"),
        ("ПН", "Жим гантелей сидя", "База плечи", 3, "12-15", 6),
        ("ПН", "Махи в стороны", "Изоляция средняя дельта", 3, "15-20", "5-6"),
        ("ПН", "Трицепс в тренажёре", "Изоляция трицепс", 3, "15-18", 6),
        ("ПН", "Французский жим лёжа", "Изоляция трицепс", 3, "15-18", 6),
        ("СР", "Пуловер", "Предутомление спины", 3, "15-20", 5),
        ("СР", "Подтягивания без веса", "База спина", 3, "8-10", "5-6"),
        ("СР", "Тяга штанги в наклоне лёгкая", "База спина", 3, "10-12", 6),
        ("СР", "Подъём штанги на бицепс стоя лёгкая", "База бицепс", 3, "12-15", 6),
        ("СР", "Молотковые сгибания лёгкие", "Изоляция бицепс", 3, "15-18", 6),
        ("СР", "Разведения в наклоне лёгкие", "Изоляция задняя дельта", 3, "15-20", "5-6"),
        ("СР", "Скамья Скотта лёгкая", "Добивка бицепс", 2, "15-20", 6),
        ("ПТ", "Разгибания ног сидя", "Предутомление квадрицепс", 3, "18-20", 5),
        ("ПТ", "Приседания со штангой (50-60%)", "База ноги", 3, "10-12", 6),
        ("ПТ", "Румынская тяга лёгкая", "База бицепс бедра", 3, "12-15", 6),
        ("ПТ", "Жим гантелей сидя лёгкий", "База плечи", 3, "12-15", 6),
        ("ПТ", "Суперсет: махи + разведения лёгкие", "Изоляция плечи", 3, "15-20", "5-6"),
        ("ПТ", "Сгибания ног сидя лёгкие", "Изоляция бицепс бедра", 3, "15", "5-6"),
        ("ПТ", "Подъёмы на носки стоя лёгкие", "Изоляция икры", 3, "20-25", 5),
        ("ПТ", "Разгибания с канатом лёгкие", "Добивка трицепс", 2, "18-20", 5),
        ("ПТ", "Концентрированные сгибания лёгкие", "Добивка бицепс", 2, "15-18", 5),
    ],
    4: [  # Пиковая неделя
        ("ПН", "Бабочка", "Предутомление груди", 2, "6-8", 8),
        ("ПН", "Жим гантелей лёжа", "База грудь", 5, "3-5", 10),
        ("ПН", "Брусья с весом", "База грудь/трицепс", 4, "3-5", 10),
        ("ПН", "Жим гантелей сидя", "База плечи", 4, "5-6", 9),
        ("ПН", "Махи в стороны", "Изоляция средняя дельта", 2, "10-12", 8),
        ("ПН", "Трицепс в тренажёре", "Изоляция трицепс", 2, "8-10", 9),
        ("СР", "Пуловер", "Предутомление спины", 2, "8-10", 9),
        ("СР", "Подтягивания с весом", "База спина", 5, "3-5", 10),
        ("СР", "Тяга штанги в наклоне", "База спина", 5, "3-5", 10),
        ("СР", "Подъём штанги на бицепс стоя", "База бицепс", 3, "6-8", 9),
        ("СР", "Разведения в наклоне", "Изоляция задняя дельта", 2, "10-12", 8),
        ("СР", "Скамья Скотта", "Добивка бицепс", 3, "6-8", 9),
        ("ПТ", "Разгибания ног сидя", "Предутомление квадрицепс", 3, "8-10", 9),
        ("ПТ", "Приседания со штангой", "База ноги", 5, "3-5", 10),
        ("ПТ", "Румынская тяга", "База бицепс бедра", 4, "5-6", "9-10"),
        ("ПТ", "Жим гантелей сидя", "База плечи", 4, "5-6", 9),
        ("ПТ", "Подъёмы на носки стоя", "Изоляция икры", 4, "8-10", 9),
    ]
}

# ==================== НАСТРОЙКИ СТИЛЕЙ ====================
header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill(start_color="2C3E50", end_color="2C3E50", fill_type="solid")
thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
center_align = Alignment(horizontal='center', vertical='center')

# ==================== СОЗДАНИЕ ФАЙЛА ====================
wb = openpyxl.Workbook()
wb.remove(wb.active)  # удаляем дефолтный лист

week_names = {
    1: "Неделя 1 (Тяжёлая)",
    2: "Неделя 2 (Средняя)",
    3: "Неделя 3 (Лёгкая)",
    4: "Неделя 4 (Пиковая)"
}

for week_num in range(1, 5):
    ws = wb.create_sheet(title=week_names[week_num])
    headers = ["День", "Упражнение", "Тип", "Подходы", "План повторов", "План RPE",
               "Вес (кг)", "Факт повторы", "Факт RPE", "Выполнено"]
    for col, h in enumerate(headers, start=1):
        cell = ws.cell(row=1, column=col, value=h)
        cell.font = header_font
        cell.fill = header_fill
        cell.alignment = center_align
        cell.border = thin_border

    # Заполняем данные
    for row_idx, row_data in enumerate(data[week_num], start=2):
        for col_idx, val in enumerate(row_data, start=1):
            cell = ws.cell(row=row_idx, column=col_idx, value=val)
            cell.border = thin_border
            cell.alignment = Alignment(horizontal='left', vertical='center')
        # Пустые ячейки для заполнения
        for col_idx in range(7, 11):
            ws.cell(row=row_idx, column=col_idx, value="").border = thin_border

    # Закрашиваем строки по дням (ПН, СР, ПТ)
    day_colors = {
        "ПН": PatternFill(start_color="D9EAD3", end_color="D9EAD3", fill_type="solid"),
        "СР": PatternFill(start_color="CFE2F3", end_color="CFE2F3", fill_type="solid"),
        "ПТ": PatternFill(start_color="FCE5CD", end_color="FCE5CD", fill_type="solid"),
    }
    for row in range(2, ws.max_row+1):
        day_val = ws.cell(row=row, column=1).value
        if day_val in day_colors:
            for col in range(1, 11):
                ws.cell(row=row, column=col).fill = day_colors[day_val]

    # Автоширина колонок
    for col in range(1, 11):
        max_len = 0
        for row in range(1, ws.max_row+1):
            val = ws.cell(row, col).value
            if val:
                max_len = max(max_len, len(str(val)))
        ws.column_dimensions[get_column_letter(col)].width = max_len + 2

    # Включаем фильтр
    ws.auto_filter.ref = f"A1:J{ws.max_row}"

# ==================== ЛИСТ "ДНЕВНИК" ====================
diary = wb.create_sheet(title="Дневник")
diary_headers = ["Дата", "Неделя", "День", "Упражнение", "Подход", "Вес (кг)", "Повторы", "RPE", "Отметка"]
for col, h in enumerate(diary_headers, start=1):
    cell = diary.cell(row=1, column=col, value=h)
    cell.font = header_font
    cell.fill = header_fill
    cell.alignment = center_align
    cell.border = thin_border

# Пример заполнения (можно удалить)
example = ["03.06.2025", 1, "ПН", "Жим гантелей лёжа", 1, 30, 7, 8, "✔"]
for col, val in enumerate(example, start=1):
    cell = diary.cell(row=2, column=col, value=val)
    cell.border = thin_border

# Автоширина
for col in range(1, 10):
    max_len = 0
    for row in range(1, diary.max_row+1):
        val = diary.cell(row, col).value
        if val:
            max_len = max(max_len, len(str(val)))
    diary.column_dimensions[get_column_letter(col)].width = max_len + 2
diary.auto_filter.ref = f"A1:I{diary.max_row}"

# ==================== СОХРАНЕНИЕ ====================
filename = "Сплит_руки_плечи_4_недели.xlsx"
wb.save(filename)
print(f"Готово! Файл создан: {filename}")
print("Листы: Неделя 1-4 (с периодизацией) + Дневник.")