81 lines
3.1 KiB
Python
81 lines
3.1 KiB
Python
"""Генерация итоговых файлов: объединённая форма и Таблица 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)
|