Files
kadastr18/README.md
jze9 75d01219d3 Сборка Windows .exe (onefile) + инструкция
build.bat собирает «Приём документов.exe» одним файлом через PyInstaller.
Добавлена инструкция для пользователя и раздел сборки в README.
.gitignore исключает build-артефакты (*.exe, build/, dist/, *.spec).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 03:22:30 +05:00

5.8 KiB
Raw Blame History

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

Программа вносит данные о принятых документах из файлов в папке прием в файл 2026_ЕДИНЫЙ РЕЕСТР НЕВОСТРЕБОВАННЫХ ДОКУМЕНТОВ на соответствующие листы (последующими записями) и заполняет Журнал внесения.

Работает на чистых Python-библиотеках (odfpy, openpyxl, xlrd), LibreOffice не требуется. Оформление реестра (стили ячеек, формат дат, прочие листы) сохраняется: новые строки копируют стиль последней строки листа.

Запуск

Графический интерфейс (выбор файлов мышью, кнопка «Внести данные»):

pip install -r requirements.txt
python3 gui.py

Или из командной строки (по умолчанию берёт файлы из текущей папки):

python3 run.py

Оригиналы не изменяются — результат пишется рядом:

  • 2026_ЕДИНЫЙ РЕЕСТР НЕВОСТРЕБОВАННЫХ ДОКУМЕНТОВ._ЗАПОЛНЕНО.ods
  • Журнал внесения_ЗАПОЛНЕНО.xlsx

Скрипт идемпотентен: всегда читает оригиналы, повторный запуск не задваивает данные.

Сборка .exe для Windows (один файл)

На Windows (Python 3.10+ с галочкой «Add to PATH») достаточно запустить build.bat — он установит зависимости и соберёт один файл:

build.bat

Результат: dist\Приём документов.exe — всё внутри одного файла, у конечного пользователя ничего ставить не нужно. В onefile-режиме пути по умолчанию не работают, файлы реестра/журнала и папку прием нужно указать в окне кнопками «Обзор».

Кросс-сборка из Linux напрямую невозможна (PyInstaller собирает под ту ОС, где запущен); на Linux это делается через Wine с Windows-Python.

Правило сопоставления

Файл DD.MM.YYYY_74_NN.<ext> из папки ТОk → лист ТОk_NN реестра.

По заданию: «внести все строки, начиная со второй». Поэтому пропускается только шапка (строка 1), а каждая последующая непустая строка вносится как отдельная запись — без фильтрации по № п/п. № п/п в реестре проставляется заново (сквозной, продолжает нумерацию листа), исходный № отбрасывается.

Колонки источника B…M переносятся позиционно в одноимённые колонки листа. Значения ячеек очищаются от внешних пробелов (единообразно для всех форматов).

Данные правее колонки M

В реестре 13 колонок (A…M). Если в источнике есть данные в 14-й колонке (напр. «закладная погашена» в 16.04.2026_74_33), отдельной колонки для них нет — они добавляются в «Примечание» той же строки. Все такие случаи перечисляются в Pipeline().run().notes (информационно).

Известное ограничение

Сопоставление колонок — позиционное (колонка N источника → колонка N листа). Это верно для текущего шаблона приёма. Если появится файл с другим порядком или набором колонок (сдвиг влево), значения попадут не в свои поля, и это не будет обнаружено автоматически — сдвиг вправо/лишние колонки ловятся предупреждением, сдвиг влево — нет. При смене шаблона нужна проверка по заголовкам.

Структура

gui.py                     десктоп-интерфейс (tkinter)
run.py                     точка входа из командной строки
priem_register/
  config.py                пути, константы, раскладка колонок A..M
  models.py                Record, SourceFile, JournalEntry
  mapping.py               поиск файлов приёма и привязка к листам
  readers/                 чтение источников по форматам
    base.py                SourceReader: пропуск шапки, все непустые строки, нарезка колонок
    xls_reader.py          .xls  (xlrd; даты-сериалы Excel)
    xlsx_reader.py         .xlsx (openpyxl)
    ods_reader.py          .ods  (odfpy; разворот повторов)
    factory.py             выбор читателя по расширению
  writers/
    register_writer.py     дозапись строк в .ods с копированием стилей
    journal_writer.py      заполнение журнала .xlsx
  pipeline.py              оркестратор