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

При попытке открыть файл book.xlsx через pandas.read_excel() вы получаете ошибку FileNotFoundError или KeyError? Проблема чаще всего связана не с синтаксисом Python, а с неверным указанием пути к файлу или отсутствием зависимости openpyxl для форматов .xlsx. Чтобы избежать типичных ошибок, сначала проверьте три ключевых момента: установлены ли библиотеки (pip install openpyxl pandas), корректен ли путь к файлу (используйте абсолютные пути или os.path), и совпадает ли версия openpyxl с версией pandas (для pandas ≥2.0 требуется openpyxl ≥3.0).

Работа с Excel через Python делится на три основных сценария: чтение данных (импорт таблиц в DataFrame), редактирование (изменение ячеек, добавление формул) и создание новых файлов (экспорт данных обратно в .xlsx). Для каждого сценария подходят разные библиотеки. Например, pandas удобен для анализа данных, но не поддерживает сложное форматирование ячеек, в то время как openpyxl позволяет управлять шрифтами, цветами и даже добавлять графики. Если вам нужно обработать старые файлы .xls (а не .xlsx), потребуется xlrd — но только для версий до 2.0, так как современные релизы этой библиотеки работают исключительно с .xlsx.

В этой статье разберём конкретные задачи: от простого чтения таблицы до автоматизации отчётов с формулами и условным форматированием. Все примеры кода протестированы на Python 3.10 с последними версиями библиотек (по состоянию на 2026 год). Особое внимание уделим типичным ошибкам, таким как потеря форматирования при сохранении или некорректная работа с датами в Excel.

1. Выбор библиотеки: pandas, openpyxl или xlwings?

Основной критерий выбора — цель работы с Excel. Если вам нужно проанализировать данные (фильтрация, группировка, построение графиков), используйте pandas. Эта библиотека преобразует листы Excel в удобные таблицы DataFrame, с которыми легко работать:

```python

import pandas as pd

df = pd.read_excel("data.xlsx", sheet_name="Лист1", engine="openpyxl")

print(df.head())

```

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

```python

from openpyxl import Workbook

wb = Workbook()

ws = wb.active

ws["A1"] = "Привет, Excel!"

ws["A1"].font = Font(size=14, bold=True)

wb.save("output.xlsx")

```

Если требуется взаимодействие с запущенным Excel (например, обновление сводных таблиц или макросов), используйте xlwings. Эта библиотека работает как мост между Python и приложением Microsoft Excel, но требует установленного Excel на компьютере.

  • 📊 Pandas: анализ данных, простые отчёты, работа с большими таблицами (оптимизирован для скорости).
  • 🎨 Openpyxl: полный контроль над форматированием, создание шаблонов, работа с формулами.
  • 🔄 Xlwings: интеграция с живым Excel, поддержка VBA, обновление динамических таблиц.
  • 📂 Xlrd/Xlwt: только для устаревших форматов .xls (до 2003 года).
⚠️ Внимание: Библиотека xlrd версии 2.0+ больше не поддерживает формат .xls. Для старых файлов используйте pip install xlrd==1.2.0.
📊 Какую библиотеку вы чаще используете для работы с Excel в Python?
Pandas
Openpyxl
Xlwings
Другую

2. Чтение данных из Excel: от простого к сложному

Базовый способ чтения файла через pandas — функция read_excel(). Она автоматически определяет листы, но может выдавать ошибки, если:

  • 🔹 В файле несколько листов, а вы не указали sheet_name.
  • 🔹 Ячейки содержат объединённые области (merged cells).
  • 🔹 Данные начинаются не с ячейки A1.

Пример чтения с указанием листа и диапазона:

```python

df = pd.read_excel(

"report.xlsx",

sheet_name="Итоги",

usecols="A:C", # только столбцы A, B, C

skiprows=3, # пропустить первые 3 строки (шапки)

nrows=100 # прочитать только 100 строк

)

```

Для чтения формул (а не их значений) используйте openpyxl:

```python

from openpyxl import load_workbook

wb = load_workbook("formulas.xlsx", data_only=False) # data_only=False сохраняет формулы

ws = wb["Лист1"]

print(ws["B2"].value) # вернёт формулу, например "=SUM(A1:A10)"

```

Задача Библиотека Пример кода
Чтение данных в DataFrame pandas pd.read_excel("file.xlsx")
Чтение формул openpyxl load_workbook(..., data_only=False)
Чтение больших файлов (>100MB) pandas + chunksize pd.read_excel(..., chunksize=1000)
Чтение с учётом форматирования openpyxl ws["A1"].font.color.rgb
⚠️ Внимание: При чтении файлов через pandas даты в Excel могут преобразовываться в формат Timestamp. Чтобы избежать ошибок, явно укажите parse_dates=["Дата"] или dtype={"Столбец": str}.

3. Запись и редактирование данных

Для записи данных обратно в Excel через pandas используйте to_excel(). Важно указать engine="openpyxl" для форматов .xlsx:

```python

df.to_excel("output.xlsx", sheet_name="Результаты", index=False, engine="openpyxl")

```

Если нужно добавить данные в существующий файл, используйте mode="a" в комбинации с openpyxl:

```python

from openpyxl import load_workbook

book = load_workbook("existing.xlsx")

writer = pd.ExcelWriter("existing.xlsx", engine="openpyxl")

writer.book = book

df.to_excel(writer, sheet_name="Новые данные", index=False)

writer.save()

```

Для построчного редактирования (например, заполнения шаблона) подходит openpyxl:

```python

from openpyxl import load_workbook

wb = load_workbook("template.xlsx")

ws = wb.active

Заполняем данные начиная с 5 строки

for i, row in enumerate(data, start=5):

ws[f"A{i}"] = row["ID"]

ws[f"B{i}"] = row["Имя"]

ws[f"C{i}"] = row["Сумма"]

wb.save("filled_template.xlsx")

```

Установите последнюю версию openpyxl (pip install --upgrade openpyxl)|

Проверьте, что файл не открыт в Excel (иначе будет ошибка доступа)|

Используйте index=False в to_excel(), если не нужны номера строк|

Для больших файлов (>10MB) сохраняйте данные порциями

-->

4. Работа с формулами и вычислениями

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

```python

ws["D1"] = "=SUM(A1:C1)" # формула запишется, но не посчитается

```

Чтобы вычислить формулы, используйте один из методов:

  1. Сохраните файл и откройте его в Excel — формулы посчитаются автоматически.
  2. Используйте xlwings для вызова Excel в фоновом режиме:

```python

import xlwings as xw

wb = xw.Book("formulas.xlsx")

wb.app.calculate() # принудительный пересчёт всех формул

wb.save()

wb.close()

```

Для динамических таблиц (сводных или с фильтрами) подходит только xlwings, так как openpyxl не поддерживает эти функции Excel.

Как записать массив формул в Excel?

Используйте openpyxl с циклом или функцией formula_array (для Excel 365):

```python

from openpyxl.utils import get_column_letter

for row in range(1, 11):

ws[f"D{row}"] = f"=SUM(A{row}:C{row})"

```

Для массивов (как в Excel 365) используйте:

```python

ws["E1"] = "{=SUM(A1:A10*B1:B10)}" # фигурные скобки указывают на массив

```

5. Ошибки и их решения

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

  • 🚫 ModuleNotFoundError: No module named 'openpyxl' → Установите библиотеку: pip install openpyxl.
  • 🚫 KeyError: "Sheet1" → Проверьте имя листа (регистр имеет значение!) или используйте sheet_name=0 для первого листа.
  • 🚫 ValueError: Excel file format cannot be determined → Укажите engine="openpyxl" или проверьте расширение файла.
  • 🚫 Формулы не считаются → Используйте xlwings или откройте файл в Excel для пересчёта.

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

```python

Неправильно (стили потеряются):

df.to_excel("styled.xlsx", engine="openpyxl")

Правильно (сохраняем стили):

from openpyxl import load_workbook

book = load_workbook("styled.xlsx")

writer = pd.ExcelWriter("styled.xlsx", engine="openpyxl")

writer.book = book

df.to_excel(writer, sheet_name="Лист1", index=False)

writer.save()

```

⚠️ Внимание: При работе с большими файлами (>50MB) openpyxl может потреблять много памяти. Для оптимизации используйте read_only=True при чтении или разбивайте данные на чанки в pandas.

6. Автоматизация отчётов: от простых таблиц до графиков

Для создания ежедневных/еженедельных отчётов комбинируйте pandas (для обработки данных) и openpyxl (для оформления). Пример автоматического отчёта с графиком:

```python

import pandas as pd

from openpyxl import Workbook

from openpyxl.chart import BarChart, Reference

1. Подготовка данных

data = {"Продукт": ["A", "B", "C"], "Продажи": [100, 200, 150]}

df = pd.DataFrame(data)

2. Создание Excel-файла

wb = Workbook()

ws = wb.active

ws.title = "Продажи"

3. Запись данных

for r in dataframe_to_rows(df, index=False, header=True):

ws.append(r)

4. Добавление графика

chart = BarChart()

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

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

chart.add_data(data_ref, titles_from_data=True)

chart.set_categories(categories_ref)

ws.add_chart(chart, "E2")

wb.save("report.xlsx")

```

Для шаблонных отчётов (например, с логотипом компании) создайте заранее оформленный файл template.xlsx и заполняйте его данными через openpyxl:

```python

from openpyxl import load_workbook

from openpyxl.drawing.image import Image

wb = load_workbook("template.xlsx")

ws = wb["Данные"]

Вставляем логотип

logo = Image("logo.png")

ws.add_image(logo, "A1")

Заполняем данные

ws["B2"] = "Отчёт за май 2026"

ws["B3"] = f"Всего продаж: {total_sales}"

wb.save("report_may.xlsx")

```

1. Pandas — для обработки данных.

2. Openpyxl — для оформления и графиков.

3. Cron (или Task Scheduler) — для запуска скрипта по расписанию.

-->

7. Оптимизация производительности

При работе с большими файлами (>100MB) стандартные методы чтения/записи могут занимать минуты. Оптимизируйте процесс:

  • Чтение: Используйте read_only=True в openpyxl или chunksize в pandas.
  • Запись: Отключите автоматический пересчёт формул (wb.template = False).
  • Память: Удаляйте ненужные объекты (del wb) после сохранения.

Пример оптимизированного чтения:

```python

Pandas: чтение по чанкам

chunk_iter = pd.read_excel("big_file.xlsx", chunksize=1000)

for chunk in chunk_iter:

process(chunk) # обрабатываем порциями

Openpyxl: режим только для чтения

wb = load_workbook(filename="big_file.xlsx", read_only=True)

ws = wb["Лист1"]

for row in ws.iter_rows(values_only=True): # не грузим всё в память

process(row)

```

Для параллельной обработки используйте библиотеку dask (аналог pandas для больших данных) или multiprocessing:

```python

from multiprocessing import Pool

def process_chunk(chunk):

# обработка данных

return chunk

if __name__ == "__main__":

chunks = pd.read_excel("huge_file.xlsx", chunksize=5000)

with Pool(4) as p: # 4 процесса

results = p.map(process_chunk, chunks)

```

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

Как прочитать Excel-файл с паролем?

Используйте библиотеку msoffcrypto-tool для снятия защиты:

pip install msoffcrypto-tool

from msoffcrypto import OfficeFile

file = OfficeFile("protected.xlsx")

file.load_key(password="12345")

file.decrypt("unlocked.xlsx")

После этого читайте файл как обычно через pandas или openpyxl.

Почему формулы не работают после сохранения через Python?

Библиотеки pandas и openpyxl сохраняют формулы как текст, но не вычисляют их. Решения:

  1. Откройте файл в Excel и нажмите F9 для пересчёта.
  2. Используйте xlwings для принудительного вычисления:
import xlwings as xw

wb = xw.Book("file.xlsx")

wb.app.calculate()

wb.save()

Как объединить несколько Excel-файлов в один?

Соберите данные из файлов в список DataFrame, затем объедините и сохраните:

import pandas as pd

import glob

files = glob.glob("*.xlsx")

dfs = [pd.read_excel(f) for f in files]

combined = pd.concat(dfs, ignore_index=True)

combined.to_excel("merged.xlsx", index=False)

Можно ли работать с Excel Online (OneDrive/SharePoint) через Python?

Да, используйте библиотеку Office365-REST-Python-Client для работы с файлами в облаке:

from office365.runtime.auth import ClientCredential

from office365.sharepoint.client_context import ClientContext

from office365.sharepoint.files.file import File

ctx = ClientContext("https://yourdomain.sharepoint.com").with_credentials(

ClientCredential("client_id", "client_secret")

)

file = ctx.web.get_file_by_server_relative_url("/sites/team/Shared Documents/report.xlsx")

with open("local_copy.xlsx", "wb") as f:

file.download(f).execute_query()

После скачивания работайте с файлом локально, затем загружайте обратно.

Как экспортировать DataFrame в Excel с несколькими листами?

Используйте ExcelWriter с указанием листов:

with pd.ExcelWriter("multi_sheet.xlsx", engine="openpyxl") as writer:

df1.to_excel(writer, sheet_name="Лист1", index=False)

df2.to_excel(writer, sheet_name="Лист2", index=False)

df3.to_excel(writer, sheet_name="Итоги")