Скрипт для автоматической фильтрации 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- Создайте папку
in/в корне проекта - Поместите .xlsx файлы с проводками в папку
in/ - Убедитесь, что файл
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.xlsxproject/
├── 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 |
| Файл | Строка | Описание ошибки |
|---|---|---|
| file1.xlsx | 5 | Пустое значение Аналитики после LE в колонке 1 |
| file2.xlsx | Ошибка загрузки файла: File is not a zip file | |
| file3.xlsx | 10 | Некорректный формат суммы: 'abc' -> cleaned 'abc' |
Содержит листы по каждому файлу с пропущенными строками (где LE не совпадает или другие неошибочные пропуски) и сохраненными стилями.
Файлы должны содержать данные в формате Excel. Скрипт автоматически определяет первую непустую строку как заголовок. Ожидаются:
- 8-я колонка (индекс 7): Суммы в числовом формате (например, "427680000.00"). Скрипт парсит и проверяет формат.
- 4-я колонка (индекс 3): Даты в формате, который можно преобразовать в dd.mm.yyyy.
- Другие колонки: Любые данные; поиск "LE" происходит в любой колонке, следующая - аналитика.
Простой текстовый файл с 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.
Примечание: Убедитесь, что входные файлы соответствуют ожидаемому формату Диасофт для корректной обработки.