Загрузка данных
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 (с периодизацией) + Дневник.")