Приём документов → реестр + журнал
Внесение данных из файлов приёма в реестр невостребованных документов и заполнение журнала. Дата внесения — текущая; журнал заполняется чисто (без строк-примеров шаблона). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
52
priem_register/writers/journal_writer.py
Normal file
52
priem_register/writers/journal_writer.py
Normal 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
|
||||
Reference in New Issue
Block a user