test
This commit is contained in:
80
services/output_generator.py
Normal file
80
services/output_generator.py
Normal file
@@ -0,0 +1,80 @@
|
||||
"""Генерация итоговых файлов: объединённая форма и Таблица 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)
|
||||
Reference in New Issue
Block a user