import xlwings as xw
# ---------------- НАСТРОЙКИ ----------------
FILE = r"Мониторинг готовности к НУГ 2026.xlsx"
SOURCE_SHEET = "Список"
TEMPLATE_SHEET = "Свод"
START_ROW = 2 # с какой строки начинаются названия
NAME_COLUMN = 1 # 1=A, 2=B, 3=C...
# -------------------------------------------
app = xw.App(visible=False, add_book=False)
app.display_alerts = False
app.screen_updating = False
try:
wb = app.books.open(FILE)
source = wb.sheets[SOURCE_SHEET]
template = wb.sheets[TEMPLATE_SHEET]
last_row = source.range((source.cells.last_cell.row, NAME_COLUMN)).end("up").row
for row in range(START_ROW, last_row + 1):
value = source.range((row, NAME_COLUMN)).value
if value is None or str(value).strip() == "":
continue
name = str(value).strip()
# Недопустимые символы в названии листа
for ch in r'[]:*?/\\':
name = name.replace(ch, "_")
name = name[:31]
# Если имя уже существует
original = name
i = 1
while any(s.name == name for s in wb.sheets):
name = f"{original[:28]}_{i}"
i += 1
# Копируем лист "Свод"
template.api.Copy(After=wb.sheets[-1].api)
new_sheet = wb.sheets[-1]
new_sheet.name = name
# Записываем название
cell = new_sheet.range("A1")
cell.value = value
# Форматирование
cell.api.Font.Name = "Arimo"
cell.api.Font.Size = 48
cell.api.Font.Bold = True
cell.api.Font.Color = 255 # Красный
# Центрирование
cell.api.HorizontalAlignment = -4108
cell.api.VerticalAlignment = -4108
wb.save()
wb.close()
finally:
app.quit()
print("Готово!")