Thanks to visit codestin.com
Credit goes to github.com

Skip to content

AlexMiaWat/manual_postings

Repository files navigation

📊 Фильтрация файлов Диасофт по LE

Python OpenPyXL

Скрипт для автоматической фильтрации Excel-файлов с проводками из системы Диасофт по списку Legal Entities (LE). Обрабатывает файлы в папке in/, фильтрует строки по LE и сохраняет результаты в папку out/.

📋 Оглавление

🚀 Быстрый старт

# 1. Установите зависимости
pip install openpyxl pandas

# 2. Подготовьте файлы
# - Поместите .xlsx файлы в папку in/
# - Убедитесь, что файл LE.txt содержит список LE

# 3. Запустите скрипт
python filter_diasoft_acc_by_LE.py

📖 Описание

Скрипт анализирует Excel-файлы с проводками из учетной системы Диасофт и фильтрует строки на основе списка Legal Entities (LE). Каждая строка проверяется на наличие значения "LE" в любой колонке, после чего следующая колонка проверяется на совпадение с LE из списка LE.txt. Автоматически определяет строку заголовка как первую непустую строку. Обрабатывает суммы в 8-й колонке (индекс 7), парсит их в числа и проверяет формат. Для 4-й колонки (индекс 3) пытается преобразовать значения в даты. Сохраняет оригинальные стили ячеек, включая шрифты, границы, фон и форматы чисел/дат. Удаляет пустые строки в конце выходных файлов.

🔍 Логика фильтрации

  • Поиск LE: В каждой строке ищется значение "LE" (без учета регистра) в любой колонке
  • Проверка аналитики: Следующая колонка после "LE" проверяется на совпадение с LE из списка (игнорируя регистр, пробелы и тире)
  • Обработка сумм: В 8-й колонке (индекс 7) ожидается сумма; парсится в float, проверяется формат (например, "427680000.00")
  • Обработка дат: В 4-й колонке (индекс 3) значения преобразуются в формат даты (dd.mm.yyyy)
  • Регистронезависимость: Все сравнения выполняются в верхнем регистре
  • Сохранение стилей: Оригинальные форматы и стили ячеек сохраняются с помощью openpyxl
  • Автоматическое определение заголовка: Первая непустая строка считается заголовком
  • Удаление пустых строк: Пустые строки в конце выходного листа удаляются

📊 Пример структуры файла

Любая колонка Следующая колонка ... Дата (4-я) ... Сумма (8-я)
LE LE001 ... 2023-01-01 ... 1000.00
Другая Значение LE LE004 ... 2000.50

Скрипт ищет "LE" в строке и проверяет следующую колонку на совпадение с LE.txt.

⚙️ Установка

Требования

  • Python 3.7+
  • openpyxl
  • pandas

Установка зависимостей

pip install openpyxl pandas

Подготовка файлов

  1. Создайте папку in/ в корне проекта
  2. Поместите .xlsx файлы с проводками в папку in/
  3. Убедитесь, что файл LE.txt содержит список LE (по одному на строку)

📝 Использование

Основной скрипт

python filter_diasoft_acc_by_LE.py

Что делает скрипт:

  • Обрабатывает все .xlsx файлы в папке in/
  • Автоматически определяет заголовок как первую непустую строку
  • Фильтрует строки по LE: ищет "LE" в строке, проверяет следующую колонку на совпадение с LE.txt
  • Обрабатывает суммы в 8-й колонке (парсит в числа) и даты в 4-й колонке
  • Создает папку out/ с отфильтрованными файлами (стили сохранены, пустые строки удалены)
  • Создает файл skipped.xlsx с пропущенными строками (стили сохранены)
  • Создает файл errors.xlsx с информацией об ошибках
  • Ведет подробное логирование в log.md и консоль (с rich, если доступен)

Генерация тестовых файлов

python generate_test_files.py

Создает тестовые файлы для проверки различных сценариев обработки.

🧪 Тестирование

Тестовые файлы

Скрипт generate_test_files.py создает следующие тестовые файлы:

Файл Описание
test_empty.xlsx Пустая таблица
test_no_columns.xlsx Файл без колонок ТИП/АНАЛИТИКА
test_empty_le.xlsx Файлы с пустыми значениями LE
test_corrupted.xlsx Поврежденный файл
test_multiple_le.xlsx Файлы с несколькими LE в строке
test_le_different_columns.xlsx LE в разных колонках
test_empty_rows.xlsx Файлы с пустыми строками
test_invalid_data.xlsx Некорректные данные

Запуск тестов

# 1. Сгенерируйте тестовые файлы
python generate_test_files.py

# 2. Запустите основную обработку
python filter_diasoft_acc_by_LE.py

# 3. Проверьте результаты в папке out/ и файлы skipped.xlsx, errors.xlsx

📁 Структура проекта

project/
├── filter_diasoft_acc_by_LE.py    # Основной скрипт фильтрации
├── generate_test_files.py         # Генератор тестовых файлов
├── LE.txt                         # Список LE для фильтрации
├── LE_test.txt                    # Тестовый список LE
├── log.md                         # Лог выполнения
├── README.md                      # Документация
├── in/                            # Входные файлы
│   ├── file1.xlsx
│   ├── file2.xlsx
│   └── ...
└── out/                           # Выходные файлы (создается автоматически)
    ├── file1.xlsx                 # Отфильтрованные файлы
    ├── file2.xlsx
    ├── skipped.xlsx               # Пропущенные строки
    └── errors.xlsx                # Информация об ошибках

🔍 Логирование

Скрипт ведет подробное логирование в файл log.md в формате Markdown и в консоль (с цветами, если установлен rich):

  • Загруженные LE: Список всех загруженных LE с таблицей
  • Найденные файлы: Список обработанных файлов
  • Обработка строк: Детальная информация по каждой строке (фильтрация, ошибки)
  • Статистика: Количество отфильтрованных, пропущенных и ошибочных строк
  • Итоги: Финальная статистика по всем файлам

Пример лога

## Запуск скрипта filter_diasoft_acc_by_LE.py

## Настройки
### LE файл: LE.txt
### Выходная папка: out
### Файл пропущенных: skipped.xlsx
### Файл ошибок: errors.xlsx
### Лог файл: log.md

## Загруженные LE
Загружено 5 LE из LE.txt:

| LE    |
|-------|
| LE001 |
| LE002 |
| LE003 |
| LE004 |
| LE005 |

## Найденные файлы для обработки
Найдено 1 файлов в папке in/:

| Файл                  |
|-----------------------|
| PostingsForUpload.xlsx |

> **[19:35:11] ✅ Начинаю обработку файла: PostingsForUpload.xlsx**

- Начинаю построчную обработку данных для PostingsForUpload.xlsx

> **[19:35:25] ✅ Итог PostingsForUpload.xlsx — Отфильтровано: 2, Пропущено: 1, Ошибок: 0**

## Обработка завершена

| Показатель    | Количество |
|---------------|------------|
| Отфильтровано | 2          |
| Пропущено     | 1          |
| Ошибок        | 0          |

> **[19:35:30] ✅ ---**

ИТОГОВАЯ СТАТИСТИКА:
   Отфильтровано: 2 строк
   Пропущено: 1 строк
   Ошибок: 0 строк

⚠️ Обработка ошибок

Типы ошибок

Тип ошибки Описание Действие
Поврежденные файлы Файлы, которые нельзя открыть как .xlsx (ошибка в pandas или openpyxl) Пропуск файла, запись в errors.xlsx
Пустые файлы Файлы без данных Пропуск файла, запись в errors.xlsx
Отсутствие заголовка Не удалось найти первую непустую строку как заголовок Пропуск файла, запись в errors.xlsx
Ошибка суммы В 8-й колонке (индекс 7) некорректный формат суммы (например, не число или неправильный разделитель) Запись в errors.xlsx, строка пропускается
Пустые LE Найдено "LE", но следующая колонка пустая Запись в errors.xlsx, строка пропускается
Несоответствие LE Аналитика после "LE" не совпадает с LE.txt Запись в skipped.xlsx
LE без следующей колонки "LE" в последней колонке строки Запись в errors.xlsx, строка пропускается
Ошибка сохранения Не удалось сохранить выходной файл Запись в errors.xlsx

Файл ошибок (errors.xlsx)

Файл Строка Описание ошибки
file1.xlsx 5 Пустое значение Аналитики после LE в колонке 1
file2.xlsx Ошибка загрузки файла: File is not a zip file
file3.xlsx 10 Некорректный формат суммы: 'abc' -> cleaned 'abc'

Файл пропущенных строк (skipped.xlsx)

Содержит листы по каждому файлу с пропущенными строками (где LE не совпадает или другие неошибочные пропуски) и сохраненными стилями.

📄 Форматы файлов

Входные файлы (.xlsx)

Файлы должны содержать данные в формате Excel. Скрипт автоматически определяет первую непустую строку как заголовок. Ожидаются:

  • 8-я колонка (индекс 7): Суммы в числовом формате (например, "427680000.00"). Скрипт парсит и проверяет формат.
  • 4-я колонка (индекс 3): Даты в формате, который можно преобразовать в dd.mm.yyyy.
  • Другие колонки: Любые данные; поиск "LE" происходит в любой колонке, следующая - аналитика.

LE.txt

Простой текстовый файл с LE по одному на строку (игнорируются пробелы, тире, регистр):

LE004
LE002
LE001
LE003
LE005

Выходные файлы

  • Отфильтрованные файлы: Оригинальные файлы с сохраненными строками, где LE совпадает, стили сохранены, пустые строки удалены
  • skipped.xlsx: Многостраничный файл с пропущенными строками (лист на файл), стили сохранены
  • errors.xlsx: Таблица с информацией об ошибках обработки

🔧 Настройка

Константы в коде

LE_FILE = "LE.txt"          # Файл со списком LE
OUT_DIR = "out"             # Папка для выходных файлов
SKIPPED_FILE = "skipped.xlsx"  # Файл пропущенных строк
ERRORS_FILE = "errors.xlsx"    # Файл ошибок
LOG_FILE = "log.md"         # Файл логов

Зависимости

  • pandas: Используется для чтения Excel-файлов и обработки данных
  • openpyxl: Для записи Excel-файлов с сохранением стилей
  • rich (опционально): Для красивого вывода в консоль

Расширение функциональности

Скрипт можно модифицировать для:

  • Дополнительных проверок данных (например, валидация сумм и дат)
  • Разных форматов входных файлов
  • Кастомной логики фильтрации
  • Интеграции с другими системами

📜 Лицензия

Этот проект распространяется под лицензией MIT. Подробности в файле LICENSE.


Примечание: Убедитесь, что входные файлы соответствуют ожидаемому формату Диасофт для корректной обработки.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages