Найти в Дзене
Анастасия Софт

📊 Как использовать Python для сравнения данных в нескольких файлах Excel

Или как поймать расхождения до того, как это сделает бухгалтер Ситуация из реальной жизни: Можно, конечно, всё скопировать в Excel, наложить фильтры, цвета и формулы...
Но это путь страданий.
Python сделает это за тебя — быстро, красиво и без кофеина. У нас есть два Excel-файла: Каждый содержит таблицу с одинаковой структурой: Наша цель: pip install pandas openpyxl import pandas as pd
# Читаем оба файла
df_old = pd.read_excel('отчет_прошлая_неделя.xlsx')
df_new = pd.read_excel('отчет_текущая_неделя.xlsx')
# Проверим, сколько строк в каждом
print(f"Прошлая неделя: {len(df_old)} строк")
print(f"Текущая неделя: {len(df_new)} строк") 💬 Комментарии: # Убедимся, что ID — строка (на всякий случай)
df_old['ID'] = df_old['ID'].astype(str)
df_new['ID'] = df_new['ID'].astype(str)
# Убираем лишние пробелы
df_old.columns = df_old.columns.str.strip()
df_new.columns = df_new.columns.str.strip() 💬 Даже если кажется, что структура одинакова — проверяй. Excel любит сюрпризы в виде пробелов и типо
Оглавление

Или как поймать расхождения до того, как это сделает бухгалтер

Или как поймать расхождения до того, как это сделает бухгалтер
Или как поймать расхождения до того, как это сделает бухгалтер

🤔 Зачем вообще сравнивать Excel-файлы?

Ситуация из реальной жизни:

  • тебе присылают два Excel-файла с продажами,
  • в одном данные за прошлую неделю, в другом — "обновлённые",
  • а ты должен понять, что поменялось, где пропало, и кто наврал.

Можно, конечно, всё скопировать в Excel, наложить фильтры, цвета и формулы...

Но это путь страданий.

Python сделает это за тебя — быстро, красиво и без кофеина.

🎯 Что мы хотим сделать?

У нас есть два Excel-файла:

  • отчет_прошлая_неделя.xlsx
  • отчет_текущая_неделя.xlsx

Каждый содержит таблицу с одинаковой структурой:

  • ID
  • Товар
  • Категория
  • Количество
  • Сумма

Наша цель:

  1. Найти добавленные строки
  2. Найти удалённые строки
  3. Найти изменения в уже существующих строках (по ID)
  4. Сохранить сравнение в Excel-отчёт

📦 Что нужно установить?

pip install pandas openpyxl

🚀 Шаг 1: Чтение файлов

import pandas as pd

# Читаем оба файла
df_old = pd.read_excel('отчет_прошлая_неделя.xlsx')
df_new = pd.read_excel('отчет_текущая_неделя.xlsx')

# Проверим, сколько строк в каждом
print(f"Прошлая неделя: {len(df_old)} строк")
print(f"Текущая неделя: {len(df_new)} строк")

💬 Комментарии:

  • pandas.read_excel() — читает всё, что Excel может предложить.
  • Счёт строк помогает убедиться, что мы не схватили какую-то левую вкладку.

🧠 Шаг 2: Приведение к единому формату

# Убедимся, что ID — строка (на всякий случай)
df_old['ID'] = df_old['ID'].astype(str)
df_new['ID'] = df_new['ID'].astype(str)

# Убираем лишние пробелы
df_old.columns = df_old.columns.str.strip()
df_new.columns = df_new.columns.str.strip()

💬 Даже если кажется, что структура одинакова — проверяй. Excel любит сюрпризы в виде пробелов и типов данных.

🆕 Шаг 3: Найдём добавленные и удалённые строки

# Добавленные: те, что есть в новом, но нет в старом
added = df_new[~df_new['ID'].isin(df_old['ID'])]

# Удалённые: те, что были в старом, но нет в новом
removed = df_old[~df_old['ID'].isin(df_new['ID'])]

💬 Здесь isin() работает как фильтр по вхождению ID.

Знак ~ — логическое "НЕ". Так мы ищем "новеньких" и "потерянных".

🔄 Шаг 4: Найдём изменённые строки

# Объединяем по ID, чтобы сравнить остальные поля
merged = pd.merge(df_old, df_new, on='ID', how='inner', suffixes=('_old', '_new'))

# Фильтруем строки, где хотя бы одно поле отличается
changed = merged[
(merged['Количество_old'] != merged['Количество_new']) |
(merged['Сумма_old'] != merged['Сумма_new']) |
(merged['Товар_old'] != merged['Товар_new']) |
(merged['Категория_old'] != merged['Категория_new'])
]

💬 Мы берём только те строки, где ID совпал, но другие поля изменились.

suffixes помогают различать, что из какого файла пришло.

💾 Шаг 5: Сохраняем результат в Excel-отчёт

with pd.ExcelWriter('сравнение_отчетов.xlsx', engine='openpyxl') as writer:
added.to_excel(writer, sheet_name='Добавленные', index=False)
removed.to_excel(writer, sheet_name='Удалённые', index=False)
changed.to_excel(writer, sheet_name='Изменённые', index=False)

💬 Всё чётко, по вкладкам. Открываешь файл — и сразу видишь, кто отличился.

🎉 Результат

У тебя на руках файл сравнение_отчетов.xlsx, в котором:

  • Лист Добавленные — новые позиции;
  • Лист Удалённые — то, что исчезло;
  • Лист Изменённые — где поменялись значения.

🧪 Бонус-фишка: Подсветим изменения

def highlight_changes(val1, val2):
return '' if val1 == val2 else 'background-color: yellow'

styled = changed.style.apply(lambda row: [
'', '', '', '', # для ID и *_old
highlight_changes(row['Товар_old'], row['Товар_new']),
highlight_changes(row['Категория_old'], row['Категория_new']),
highlight_changes(row['Количество_old'], row['Количество_new']),
highlight_changes(row['Сумма_old'], row['Сумма_new']),
], axis=1)

styled.to_excel('изменённые_с_подсветкой.xlsx', engine='openpyxl', index=False)

💬 Этот кусочек кода делает Excel-таблицу с жёлтой подсветкой ячеек, где были изменения. Глаз радуется, ошибок меньше.

📈 Где это полезно?

  • 📦 Сравнение выгрузок из CRM/ERP по неделям
  • 🧾 Проверка версий отчётов от подрядчиков
  • 💼 Автоматизация сверки инвентаризаций

🧠 Что ты теперь умеешь:

✅ Сравнивать два Excel-файла построчно

✅ Искать добавленные и удалённые строки

✅ Выявлять изменения внутри записей

✅ Сохранять результат в понятный Excel-отчёт

✅ Подсвечивать изменения для наглядности

🏁 Финалочка

Excel — прекрасен, когда тебе нужно построить диаграмму на 10 строк.

Но когда дело касается
сравнения файлов с тысячами строк — Python просто незаменим.

Так что в следующий раз, когда тебе скажут «сравни два отчёта и скажи, где разница» — ты уже знаешь, как ответить:

«Ща, напишу скрипт, и к обеду всё будет!»