Внесение данных из файлов приёма в реестр невостребованных документов и заполнение журнала. Дата внесения — текущая; журнал заполняется чисто (без строк-примеров шаблона). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
53 lines
2.1 KiB
Python
53 lines
2.1 KiB
Python
# -*- 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
|