"""Генерация итоговых файлов: объединённая форма и Таблица 4.""" import copy import re from openpyxl import load_workbook, Workbook from openpyxl.styles import Font from services.form_filler import BASE_FONT def make_filename(kv: str, zu_file: str) -> str: """ Формат: {кв_через_подчёркивание}_{zu_file}.xlsx Пример: 74_34_0400007_выявл1_{вымпел_100}.xlsx """ kv_clean = str(kv).replace(":", "_") safe = re.sub(r'[<>"/\\|?*]', "_", str(zu_file)) return f"{kv_clean}_{safe}.xlsx" def combine_forms(form_paths: list, combined_path: str): """Объединить все формы в один лист.""" combined_wb = Workbook() combined_ws = combined_wb.active combined_ws.title = "Все формы" current_row = 1 for path in form_paths: src_wb = load_workbook(path, data_only=True) src_ws = src_wb.active last_cell = None for src_row in src_ws.iter_rows(): for cell in src_row: dst = combined_ws.cell( row=current_row + cell.row - 1, column=cell.column, ) dst.value = cell.value if cell.has_style: dst.font = copy.copy(cell.font) dst.border = copy.copy(cell.border) dst.fill = copy.copy(cell.fill) dst.number_format = cell.number_format dst.alignment = copy.copy(cell.alignment) last_cell = cell if last_cell: src_row_dim = src_ws.row_dimensions[last_cell.row] combined_ws.row_dimensions[current_row + last_cell.row - 1].height = src_row_dim.height current_row += src_ws.max_row if form_paths: src_wb = load_workbook(form_paths[0]) src_ws = src_wb.active for col_letter, col_dim in src_ws.column_dimensions.items(): combined_ws.column_dimensions[col_letter].width = col_dim.width combined_wb.save(combined_path) def generate_table4(generated: list, output_path: str): """Перечень заполненных форм (Таблица 4).""" wb = Workbook() ws = wb.active ws.title = "Перечень форм" F = BASE_FONT headers = ["№ п/п", "Кадастровый квартал", "Название файла ЗУ", "Имя файла", "Путь"] for col_idx, h in enumerate(headers, 1): ws.cell(row=1, column=col_idx, value=h).font = Font( name="Times New Roman", size=11, bold=True ) for i, rec in enumerate(generated, 1): row = i + 1 ws.cell(row=row, column=1, value=i).font = copy.copy(F) ws.cell(row=row, column=2, value=rec["kv"]).font = copy.copy(F) ws.cell(row=row, column=3, value=rec["zu_file"]).font = copy.copy(F) ws.cell(row=row, column=4, value=rec["name"]).font = copy.copy(F) ws.cell(row=row, column=5, value=rec["path"]).font = copy.copy(F) wb.save(output_path)