БэкендData и ИИPython

Как автоматизировать Excel на Python: объединяем файлы и собираем отчёт через openpyxl

Объединяем несколько Excel-файлов на Python через openpyxl, проверяем колонки, удаляем дубли, считаем итоги и сохраняем оформленный отчёт.

Кодик

Автор

6 мин чтения

openpyxl можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. openpyxl автоматизирует повторяемую работу с XLSX: чтение листов, объединение строк, формулы, стили и сохранение отдельного отчёта. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.

Пять таблиц могут иметь разный порядок колонок, пустые строки, дубли и формулы, которые библиотека не пересчитывает сама. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте скрипт, который собирает входные XLSX из папки, проверяет заголовки и создаёт один отчёт с итогами. Проверка: все корректные строки объединены, дубли по номеру заказа удалены, сумма совпадает с контрольным расчётом, исходники не изменены.

1Соберите минимум

найти XLSX во входной папке. Не расширяйте проект до первого успешного запуска.

2Увидьте данные

сломанный файл получает понятную ошибку. Проверяйте значение, а не отсутствие ошибки.

3Измените правило

После успеха добавьте листы Сводка и Ошибки, не теряя исходную строку. Так копирование станет практикой.

Как устроен учебный проект openpyxl

openpyxl разделяет подготовку, основное действие, проверку ответа и сохранение результата. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.

ЭтапДействиеПроверяемый результат
Поискнайти XLSX во входной папкевыходной файл не попадает во вход
Проверкасопоставить обязательные заголовкисломанный файл получает понятную ошибку
Сборкапрочитать строки и убрать дубли по order_idкаждый заказ встречается один раз
Отчётзаписать таблицу, формулу и стилиresult.xlsx открывается и фильтруется

Контрольные точки: поиск, проверка, сборка и отчёт. Следующий шаг начинается после совпадения с ожидаемым результатом.

Путь данных в проекте openpyxl
От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.

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

Собираем рабочий пример шаг за шагом

Материал сверялся с официальной документацией сервиса 21 октября 2026 года. Создайте окружение, установите openpyxl и подготовьте каталог input. Скрипт и result.xlsx храните вне него. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.

from pathlib import Path
from openpyxl import load_workbook, Workbook
from openpyxl.styles import Font, PatternFill

REQUIRED = ['order_id', 'date', 'manager', 'amount']

def read_rows(filename: Path):
    book = load_workbook(filename, data_only=True, read_only=True)
    sheet = book.active
    headers = [cell.value for cell in next(sheet.iter_rows())]
    if not set(REQUIRED).issubset(headers):
        raise ValueError(f'{filename.name}: нет обязательных колонок')
    indexes = {name: headers.index(name) for name in REQUIRED}
    for row in sheet.iter_rows(values_only=True):
        if row[indexes['order_id']] is None: continue
        yield {name: row[index] for name, index in indexes.items()}

def build_report(files, output='result.xlsx'):
    unique = {}
    for filename in files:
        for row in read_rows(filename): unique[str(row['order_id'])] = row
    book = Workbook(); sheet = book.active; sheet.title = 'Отчёт'
    sheet.append(REQUIRED)
    for row in unique.values(): sheet.append([row[name] for name in REQUIRED])
    sheet['F1'] = 'Итого'; sheet['F2'] = f'=SUM(D2:D{sheet.max_row})'
    for cell in sheet[1]: cell.font = Font(bold=True); cell.fill = PatternFill('solid', fgColor='D9EAD3')
    sheet.freeze_panes = 'A2'; sheet.auto_filter.ref = f'A1:D{sheet.max_row}'
    book.save(output)

files = sorted(Path('input').glob('*.xlsx'))
build_report(files)
Что должно произойти после запуска
  • result.xlsx содержит только уникальные order_id и исходные значения четырёх колонок.
  • Заголовок закреплён, фильтр включён, ячейка F2 содержит формулу общей суммы.
  • Повторный запуск даёт тот же предсказуемый результат.
  • Пустой ввод получает понятное сообщение вместо падения.

Код держит подготовку отдельно от внешнего действия, поэтому ошибку можно найти на конкретном шаге. Найдите в примере вход, проверку и место формирования результата.

Хрупкий и проверяемый вариант openpyxl
Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.

Что происходит внутри и почему это работает

read_only снижает память при чтении, data_only возвращает сохранённый результат формулы, а отдельный словарь unique делает правило дублей явным. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. openpyxl записывает формулы, но не вычисляет их как Excel. Для проверки суммы посчитайте её в Python, а формулу оставьте пользователю.

ЧастьЗа что отвечаетЧто проверить
Чтениепроверяет заголовки и выдаёт строкиисходный файл не изменяется
Нормализациясопоставляет колонки по именипорядок столбцов не важен
Записьсоздаёт новый workbook и оформлениеитог проверен отдельно

Правило дублей нужно выбрать до кода: оставить первый, последний или считать конфликт ошибкой. В примере последний файл побеждает, но отчёт должен явно фиксировать это решение. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.

Проверьте границу Поменяйте порядок колонок, добавьте пустую строку и повторяющийся order_id. Затем удалите обязательный заголовок и проверьте сообщение. Меняйте одно условие за прогон, чтобы видеть причину.

Проверяем проект и добавляем свою функцию

Добавьте лист Ошибки со строками, где amount не число, и лист Сводка с итогом по менеджерам. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.

Проверка своими руками
  1. Сохраните ожидаемый результат: все корректные строки объединены, дубли по номеру заказа удалены, сумма совпадает с контрольным расчётом, исходники не изменены.
  2. Измените правило: добавьте листы Сводка и Ошибки, не теряя исходную строку. Сначала предскажите итог.
  3. Передайте граничное значение и убедитесь, что приложение не падает.
  4. Верните корректные данные и объясните роли трёх основных частей.
Готово, если выполняются все пункты
  • выходной файл не попадает во вход
  • сломанный файл получает понятную ошибку
  • каждый заказ встречается один раз
  • result.xlsx открывается и фильтруется

Полезное улучшение сохраняет исходный сценарий и добавляет одну новую проверяемую возможность. Полезная правка проходит от нового ввода до видимого результата.

Четыре контрольные точки openpyxl
Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.

Что запомнить и куда двигаться дальше

Перед рабочим запуском сделайте резервную копию, зафиксируйте правило дублей и сравните Python-сумму с Excel-итогом. Для закрепления откройте в анализе CSV через pandas, в отчёте Ozon Seller и в выгрузке Wildberries.

Как изучить тему в Кодике

Сначала разберите входные данные и один успешный вызов, затем изучайте дополнительные параметры. Сначала восстановите главную функцию и проверьте её на трёх значениях.

ШагЧто разобратьМини-проверка
1. ОсноваPath, функции, генераторы и словари PythonОбъясните вход и выход функции.
2. ИнструментWorkbook, worksheet, iter_rows и data_onlyПовторите команду по памяти.
3. ПроектОбъединение, проверку заголовков и стилиПроверьте два сценария.
4. РефакторингСводные листы, большие файлы и журнал ошибокРазделите ввод, логику и вывод.

Перепишите ключевую функцию по памяти и проверьте её на корректном, пустом и ошибочном вводе. Базовый синтаксис закрепите через курс Python.

Выход лежит во входной папке

Следующий запуск читает собственный отчёт. Разделите каталоги.

Колонки по номеру

Изменение порядка ломает данные. Ищите индекс по заголовку.

openpyxl пересчитает формулу

Библиотека сохраняет формулу, но не является движком Excel.

Исходник перезаписывается

Ошибка уничтожает данные. Всегда создавайте новый файл.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальному источнику 1. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: Как автоматизировать Excel на Python: объединяем файлы и собираем отчёт через openpyxl
Финальный экран показывает результат, состояние запроса и понятное сообщение об ошибке без раскрытия секретов.

Короткие ответы
Зачем data_only=True?

Он читает сохранённое значение формулы вместо её текста, если результат уже вычислен Excel.

Почему заголовки ищут по имени?

Тогда перестановка столбцов не смешивает поля.

Что проверять первым, если openpyxl не запускается?

Версию среды, текущую папку, команду запуска и первую строку ошибки.

Как понять, что проект openpyxl работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.

Можно ли начать с готового кода?

Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.

Сделайте один осознанный шаг дальше

Выберите одно улучшение и проведите его от ввода до результата.

Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.