Приём документов → реестр + журнал

Внесение данных из файлов приёма в реестр невостребованных документов
и заполнение журнала. Дата внесения — текущая; журнал заполняется чисто
(без строк-примеров шаблона).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
jze9
2026-06-26 03:11:18 +05:00
commit b5f7060a1f
20 changed files with 1571 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
# -*- 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