Чтение и обработка Excel в Python: полное руководство с примерами

Введение: зачем Python для работы с Excel?

Excel остаётся одним из самых популярных инструментов для работы с табличными данными, но когда речь заходит об автоматизации, анализе больших массивов или интеграции с другими системами, его возможностей часто не хватает. Здесь на помощь приходит Python — язык программирования, который позволяет не только читать и записывать данные в Excel, но и обрабатывать их с помощью мощных библиотек.

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

Особое внимание уделим практическим примерам: парсинг данных, фильтрация, преобразование форматов и даже визуализация результатов. Если вы когда-либо сталкивались с необходимостью автоматизировать рутинные операции в Excel — этот материал для вас.

Основные библиотеки для работы с Excel в Python

Python предлагает несколько библиотек для работы с Excel, каждая из которых имеет свои особенности и сферы применения. Выбор зависит от задачи: нужно ли просто прочитать данные, изменить форматирование ячеек или провести сложный анализ.

Рассмотрим три наиболее популярные библиотеки:

  • 📊 pandas — универсальный инструмент для анализа данных, поддерживает чтение/запись Excel через read_excel() и to_excel(). Идеален для работы с большими таблицами и сложными вычислениями.
  • 📑 openpyxl — специализирована на работе с форматом .xlsx, позволяет управлять стилями ячеек, формулами и структурой книги. Подходит для задач, где важно сохранение форматирования.
  • 📈 xlrd (устаревает) — исторически использовалась для чтения .xls и .xlsx, но с 2020 года поддерживает только старые форматы. Для новых проектов рекомендуется openpyxl.

Для большинства задач комбинация pandas + openpyxl покрывает 90% потребностей: первая библиотека обрабатывает данные, вторая — управляет структурой файла. Если вам нужно только прочитать данные без изменений, достаточно pandas.

⚠️ Внимание: Библиотека xlrd версии 2.0+ не поддерживает формат .xlsx. Для работы с современными файлами Excel используйте openpyxl или обновлённую версию xlrd с ограниченной функциональностью.
Библиотека Поддерживаемые форматы Основные возможности Когда использовать
pandas .xlsx, .xls, .csv Чтение/запись данных, фильтрация, агрегация, работа с DataFrame Анализ данных, преобразование таблиц, интеграция с другими источниками
openpyxl .xlsx (не поддерживает .xls) Работа со стилями, формулами, диаграммами, структурой книги Изменение форматирования, создание отчётов с сохранением дизайна
xlrd (v1.2.0) .xls, .xlsx (до 2020) Только чтение данных, без поддержки современных функций Excel Работа с устаревшими файлами (до 2010 года)
📊 Какую библиотеку вы используете для работы с Excel в Python?
pandas
openpyxl
xlrd
Другую
Не работал с Excel в Python

Установка и настройка библиотек

Перед началом работы необходимо установить нужные библиотеки. Это можно сделать с помощью менеджера пакетов pip. Откройте терминал (или командную строку) и выполните команды:

pip install pandas openpyxl xlrd==1.2.0

Обратите внимание, что для xlrd мы указываем версию 1.2.0, так как более новые версии не поддерживают .xlsx. Если вам нужна только поддержка старых форматов .xls, можно установить актуальную версию:

pip install xlrd

После установки проверьте работоспособность, импортировав библиотеки в Python:

import pandas as pd

import openpyxl

import xlrd

Если ошибок не возникло, можно приступать к работе. Для удобства рекомендуется использовать виртуальное окружение (например, venv), чтобы избежать конфликтов версий библиотек в разных проектах.

⚠️ Внимание: При работе в Jupyter Notebook или Google Colab перед установкой библиотек добавьте восклицательный знак: !pip install pandas. В некоторых средах может потребоваться перезагрузка ядра после установки.

Чтение данных из Excel с помощью pandas

Библиотека pandas предоставляет простой и мощный инструмент для чтения данных из Excel — функцию read_excel(). Она автоматически преобразует листы Excel в объекты DataFrame, с которыми удобно работать.

Базовый синтаксис:

df = pd.read_excel('путь/к/файлу.xlsx', sheet_name='Имя_листа')

Рассмотрим основные параметры функции:

  • 📄 sheet_name — имя листа (или индекс, начиная с 0). Можно передать список для чтения нескольких листов.
  • 🔍 header — номер строки с заголовками (по умолчанию 0). Если заголовков нет, укажите header=None.
  • 📊 usecols — список столбцов для чтения (например, usecols=['A', 'C'] или usecols=[0, 2]).
  • 🔢 dtype — словарь с типами данных для столбцов (например, dtype={'Столбец1': str, 'Столбец2': float}).

Пример чтения файла с указанием листа и конкретных столбцов:

import pandas as pd

Чтение листа "Sales" с колонками A, C и E

df = pd.read_excel(

'data.xlsx',

sheet_name='Sales',

usecols='A,C,E',

header=1 # Заголовки во второй строке

)

print(df.head()) # Вывод первых 5 строк

Если в файле несколько листов, и вы хотите прочитать их все в один словарь DataFrame:

all_sheets = pd.read_excel('data.xlsx', sheet_name=None)

Доступ к листу "Sheet1": all_sheets['Sheet1']

Установить библиотеки (pip install pandas openpyxl)

Проверить путь к файлу (использовать абсолютный путь, если файл не в текущей директории)

Определить имя листа или его индекс

Указать столбцы для чтения (если не нужны все)

Проверить кодировку файла (при ошибках чтения попробуйте encoding='utf-8')-->

Обработка и фильтрация данных после чтения

После того как данные загружены в DataFrame, вы можете использовать весь арсенал средств pandas для их обработки. Рассмотрим наиболее востребованные операции:

1. Фильтрация данных

Чтобы отфильтровать строки по условию, используйте логические операции:

# Фильтрация строк, где значение в столбце 'Price' > 1000

filtered_df = df[df['Price'] > 1000]

Множественные условия (используйте скобки!)

filtered_df = df[(df['Category'] == 'Electronics') & (df['Price'] < 500)]

2. Агрегация данных

Для группировки и подсчёта статистики используйте groupby():

# Средняя цена по категориям

avg_price = df.groupby('Category')['Price'].mean()

Количество товаров в каждой категории

count_by_category = df['Category'].value_counts()

3. Обработка пропущенных значений

Пропущенные данные (NaN) можно заполнить или удалить:

# Заполнить пропуски средним значением

df['Price'].fillna(df['Price'].mean(), inplace=True)

Удалить строки с пропусками

df.dropna(inplace=True)

4. Изменение структуры данных

Часто требуется преобразовать данные из "широкого" формата в "длинный" или наоборот. Для этого используйте функции melt() и pivot():

# Преобразование из широкого формата в длинный

melted_df = pd.melt(df, id_vars=['Product'], value_vars=['Q1', 'Q2', 'Q3'])

Сводная таблица

pivot_df = df.pivot_table(index='Category', columns='Quarter', values='Sales', aggfunc='sum')

Запись данных обратно в Excel

После обработки данных часто требуется сохранить результат обратно в Excel. В pandas для этого используется метод to_excel(). Базовый синтаксис:

df.to_excel('output.xlsx', sheet_name='Results', index=False)

Ключевые параметры метода:

  • 📝 sheet_name — имя листа (по умолчанию 'Sheet1').
  • 🔢 index — сохранять ли индексы строк (по умолчанию True). Для табличных данных обычно устанавливают False.
  • 📊 startrow/startcol — смещение начала данных (например, startrow=2 для пропуска первых двух строк).
  • 🎨 engine — движок для записи ('openpyxl' или 'xlsxwriter'). По умолчанию выбирается автоматически.

Пример записи с настройками:

with pd.ExcelWriter('report.xlsx', engine='openpyxl') as writer:

df.to_excel(writer, sheet_name='Sales', index=False)

# Запись второго DataFrame на другой лист

summary_df.to_excel(writer, sheet_name='Summary', startrow=3)

Если вам нужно сохранить несколько листов в один файл, используйте ExcelWriter в контекстном менеджере with, как показано выше. Это гарантирует корректное закрытие файла и освобождение ресурсов.

Для сложного форматирования (например, изменение шрифтов, цветов ячеек) используйте openpyxl в комбинации с pandas:

from openpyxl import load_workbook

from openpyxl.styles import Font, PatternFill

Сохраняем DataFrame в Excel

df.to_excel('styled_report.xlsx', index=False)

Открываем файл для форматирования

wb = load_workbook('styled_report.xlsx')

ws = wb.active

Применяем стили

for cell in ws[1]: # Первая строка (заголовки)

cell.font = Font(bold=True, color='0000FF')

cell.fill = PatternFill(start_color='DDDDDD', end_color='DDDDDD', fill_type='solid')

wb.save('styled_report.xlsx')

⚠️ Внимание: При записи больших DataFrame в Excel (более 100 000 строк) файл может стать очень тяжёлым или даже повредиться. В таких случаях рассмотрите альтернативные форматы, например, .csv или базы данных (SQLite).

Работа с формулами и сложными данными

Если ваш Excel-файл содержит формулы, а не только значения, стандартное чтение через pandas вернёт уже вычисленные результаты. Чтобы получить сами формулы, используйте openpyxl:

from openpyxl import load_workbook

wb = load_workbook('formulas.xlsx', data_only=False) # data_only=False для чтения формул

ws = wb.active

Чтение формулы из ячейки A1

formula = ws['A1'].value

print(f"Формула в A1: {formula}")

Для записи формул обратно в Excel также подходит openpyxl:

ws['B1'] = "=SUM(A1:A10)"  # Запись формулы

wb.save('updated_formulas.xlsx')

Если вам нужно вычислить формулы программно, используйте data_only=True при открытии файла:

wb = load_workbook('formulas.xlsx', data_only=True)

ws = wb.active

Теперь ws['A1'].value вернёт вычисленное значение, а не формулу

Для работы с сводными таблицами (pivot tables) в Excel через Python потребуется более сложный подход. Библиотека openpyxl не поддерживает создание сводных таблиц напрямую, но вы можете:

  1. Создать сводную таблицу в pandas с помощью pivot_table().
  2. Записать результат в Excel.
  3. Использовать VBA-макросы или Excel API для автоматического создания сводных таблиц (например, через win32com на Windows).
Как работать с макросами в Excel через Python?

Для управления макросами в Excel на Windows можно использовать библиотеку pywin32:

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')

wb = excel.Workbooks.Open(r'C:\path\to\file.xlsx')

Запуск макроса

excel.Application.Run("Module1.MacroName")

wb.Save()

wb.Close()

excel.Quit()

Ограничения: работает только на Windows с установленным Excel. Для кросс-платформенных решений рассмотрите альтернативы, например, xlwings.

Оптимизация работы с большими файлами

При работе с Excel-файлами объёмом более 50 МБ стандартные методы чтения могут быть слишком медленными или приводить к ошибкам нехватки памяти. Рассмотрим способы оптимизации:

1. Чтение данных частями (chunking)

Если файл слишком большой, читайте его порциями с помощью параметра chunksize:

chunk_iter = pd.read_excel('large_file.xlsx', chunksize=10000)

for chunk in chunk_iter:

process(chunk) # Обработка каждой порции данных

2. Использование эффективных типов данных

Укажите типы данных для столбцов при чтении, чтобы сократить использование памяти:

dtypes = {

'ID': 'int32',

'Name': 'category',

'Price': 'float32'

}

df = pd.read_excel('data.xlsx', dtype=dtypes)

3. Альтернативные форматы

Если Excel не обязателен, рассмотрите переход на более эффективные форматы:

  • 📄 .csv — быстрее читается, но теряет форматирование.
  • 🗃️ .parquet — бинарный формат, оптимизированный для pandas (pip install pyarrow).
  • 🗂️ Базы данных (SQLite, PostgreSQL) — для очень больших наборов данных.

4. Отключение ненужных функций

При чтении через pandas отключите автоматическое определение типов и парсинг дат, если они не нужны:

df = pd.read_excel(

'data.xlsx',

engine='openpyxl',

parse_dates=False, # Не парсить даты автоматически

infer_dtype=False # Не угадывать типы данных

)

Для файлов .xlsb (бинарный формат Excel) используйте библиотеку pyxlsb, которая работает значительно быстрее pandas для этого формата:

from pyxlsb import open_workbook

with open_workbook('large_file.xlsb') as wb:

with wb.get_sheet(1) as sheet: # Первый лист

for row in sheet.rows():

print(row) # Обработка строк

Типичные ошибки и их решения

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

1. Ошибка: "ExcelFile not found" или "File not found"

Причина: Неправильно указан путь к файлу.

Решение: Используйте абсолютный путь или проверьте текущую рабочую директорию:

import os

print(os.getcwd()) # Текущая директория

df = pd.read_excel(r'C:\full\path\to\file.xlsx') # Абсолютный путь

2. Ошибка: "Unsupported format, or corrupt file"

Причина: Файл повреждён или библиотека не поддерживает его формат.

Решение:

  • Проверьте файл в Excel — открывается ли он?
  • Для .xlsx используйте engine='openpyxl'.
  • Для .xlsengine='xlrd' (версия 1.2.0).

3. Ошибка: "DataFrame is empty" после чтения

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

Решение: Проверьте:

  • Имя листа (sheet_name).
  • Номер строки с заголовками (header).
  • Наличие данных в указанных столбцах (usecols).

4. Ошибка: "MemoryError" при чтении большого файла

Причина: Недостаточно оперативной памяти.

Решение:

  • Используйте chunksize для постраничного чтения.
  • Преобразуйте файл в .csv или .parquet.
  • Увеличьте swap-файл или используйте облачные решения (например, Google Colab).

5. Ошибка: "ValueError: Excel file format cannot be determined"

Причина: Библиотека не может определить формат файла.

Решение: Явно укажите движок:

df = pd.read_excel('file.xls', engine='xlrd')

df = pd.read_excel('file.xlsx', engine='openpyxl')

Если проблема сохраняется, попробуйте открыть файл в openpyxl и сохранить его заново:

from openpyxl import load_workbook

wb = load_workbook('problem_file.xlsx')

wb.save('fixed_file.xlsx') # Сохранение в "чистом" формате

FAQ: Часто задаваемые вопросы

Можно ли читать Excel-файлы из Google Sheets в Python?

Да, для этого сначала экспортируйте таблицу из Google Sheets в формат .xlsx или .csv, затем читайте её стандартными методами. Альтернативно можно использовать API Google Sheets:

from google.oauth2 import service_account

from googleapiclient.discovery import build

creds = service_account.Credentials.from_service_account_file('credentials.json')

service = build('sheets', 'v4', credentials=creds)

sheet = service.spreadsheets()

result = sheet.values().get(spreadsheetId='ID_вашей_таблицы', range='Лист1!A1:D10').execute()

values = result.get('values', [])

Для работы с API потребуется включить Google Sheets API в Google Cloud Console и создать сервисный аккаунт.

Как обработать Excel-файл с несколькими листами, если их имена неизвестны?

Используйте sheet_name=None в pd.read_excel(), чтобы получить словарь со всеми листами:

all_sheets = pd.read_excel('file.xlsx', sheet_name=None)

for sheet_name, df in all_sheets.items():

print(f"Лист: {sheet_name}")

print(df.head())

Если нужно получить только имена листов без чтения данных, используйте openpyxl:

from openpyxl import load_workbook

wb = load_workbook('file.xlsx')

print(wb.sheetnames) # Список имён листов

Как записать DataFrame в Excel с сохранением форматирования исходного файла?

Библиотека pandas не сохраняет исходное форматирование. Чтобы сохранить стили ячеек:

  1. Откройте исходный файл с помощью openpyxl.
  2. Скопируйте данные из DataFrame в нужный лист.
  3. Сохраните файл с исходными стилями.
from openpyxl import load_workbook

import pandas as pd

Чтение исходного файла с сохранением стилей

wb = load_workbook('template.xlsx')

ws = wb.active

Запись данных из DataFrame (начиная с ячейки A1)

for r_idx, row in enumerate(df.itertuples(index=False), start=1):

for c_idx, value in enumerate(row, start=1):

ws.cell(row=r_idx, column=c_idx, value=value)

wb.save('output_with_formatting.xlsx')

Почему при записи в Excel русские буквы отображаются как "???"?

Проблема связана с кодировкой. Решения:

  • При чтении/записи укажите encoding='utf-8' (для .csv).
  • Для .xlsx кодировка определяется автоматически, но если проблема сохраняется, сохраните файл в другом формате или обновите openpyxl.
  • Проверьте шрифты в Excel: иногда проблема связана с отсутствием поддержки Кириллицы в используемом шрифте.

Если данные читаются из .csv, откройте файл в блокноте и сохраните его с кодировкой UTF-8.

Можно ли в Python создать Excel-файл с диаграммами?

Да, для этого используйте openpyxl или XlsxWriter. Пример с openpyxl:

from openpyxl import Workbook

from openpyxl.chart import BarChart, Reference

wb = Workbook()

ws = wb.active

Данные для диаграммы

data = [

['Категория', 'Продажи'],

['А', 100],

['Б', 200],

['В', 150]

]

for row in data:

ws.append(row)

Создание диаграммы

chart = BarChart()

chart.title = "Продажи по категориям"

chart.style = 10

chart.x_axis.title = "Категория"

chart.y_axis.title = "Продажи"

Данные для диаграммы

cats = Reference(ws, min_col=1, min_row=2, max_row=4)

vals = Reference(ws, min_col=2, min_row=1, max_row=4)

chart.add_data(vals, titles_from_data=True)

chart.set_categories(cats)

ws.add_chart(chart, "E1") # Размещение диаграммы

wb.save("chart_example.xlsx")

Для более сложных диаграмм рассмотрите библиотеку XlsxWriter, которая поддерживает больше типов графиков.