# -*- coding: utf-8 -*- """Заполнение журнала внесения (.xlsx) через openpyxl. Пишет строки (Дата внесения, Файл внесения, Количество записей) сразу под шапкой, сохраняя её оформление. Строки-примеры из шаблона (напр. «Например») затираются — в результате остаются только реальные записи. """ from __future__ import annotations from pathlib import Path from typing import List import openpyxl from ..models import JournalEntry _DATE_FORMAT = "DD.MM.YYYY" # Заголовок шапки в колонке A, по которому она опознаётся. _HEADER_MARKER = "дата внесения" class JournalWriter: def __init__(self, path: Path): self.wb = openpyxl.load_workbook(path) self.ws = self.wb.active def write(self, entries: List[JournalEntry]) -> None: row = self._header_row() + 1 self._clear_below(row) for entry in entries: date_cell = self.ws.cell(row=row, column=1, value=entry.date) date_cell.number_format = _DATE_FORMAT self.ws.cell(row=row, column=2, value=entry.file_name) self.ws.cell(row=row, column=3, value=entry.count) row += 1 def save(self, path: Path) -> None: self.wb.save(path) def _header_row(self) -> int: """Строка шапки (где в колонке A «Дата внесения»); по умолчанию 1.""" for row in range(1, self.ws.max_row + 1): a = self.ws.cell(row=row, column=1).value if isinstance(a, str) and a.strip().lower() == _HEADER_MARKER: return row return 1 def _clear_below(self, start: int) -> None: """Очистить значения колонок A..C во всех строках от start и ниже.""" for row in range(start, self.ws.max_row + 1): for col in (1, 2, 3): self.ws.cell(row=row, column=col).value = None