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

Работа с таблицами Excel в Python — одна из самых востребованных задач при анализе данных, автоматизации отчётности и интеграции систем. Несмотря на кажущуюся простоту, открытие файлов .xls и .xlsx имеет нюансы: от выбора библиотеки до обработки крупных файлов без перегрузки памяти. Эта статья охватывает все актуальные способы — от классического pandas до низкоуровневого openpyxl, с акцентом на производительность и типичные ошибки.

Вы узнаете не только как прочитать данные, но и как правильно закрывать файлы, избегать утечек памяти при работе с большими таблицами, а также обрабатывать специфические форматы (например, файлы с макросами .xlsm). Особое внимание уделено совместимости библиотек с последними версиями Python 3.10+ и Excel 2019/365, где старые решения вроде xlrd могут не работать без обходных путей.

1. Подготовка среды: какие библиотеки нужны для работы с Excel

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

  • 📊 pandas — универсальный инструмент для анализа данных, поддерживает чтение/запись Excel через движки openpyxl или xlsxwriter. Подходит для большинства задач, но требует больше памяти.
  • 🔧 openpyxl — низкоуровневая библиотека для работы с .xlsx (не поддерживает старый формат .xls). Позволяет редактировать ячейки, формулы, стили.
  • 📄 xlrd — устаревшая библиотека для .xls, но с оговорками работает и с .xlsx (только для чтения). В новых версиях Python может требовать форк xlrd>=2.0.
  • pyexcel — обёртка над другими библиотеками, упрощает синтаксис для простых операций.

Установить их можно через pip (рекомендуется использовать виртуальное окружение):

pip install pandas openpyxl xlrd pyexcel pyexcel-xlsx
⚠️ Внимание: Если вы работаете с файлами .xls (Excel 97-2003), избегайте openpyxl — он поддерживает только .xlsx. Для старых форматов используйте xlrd (версия 1.2.0) или pylightxl.

Для проверки установки импортируйте библиотеки в интерпретаторе Python:

import pandas as pd

import openpyxl

import xlrd

📊 Какую библиотеку вы чаще используете для работы с Excel?
pandas
openpyxl
xlrd
pyexcel
Другую

2. Способ 1: Чтение Excel через pandas — быстро и просто

pandas — самый популярный инструмент для работы с табличными данными в Python. Его метод read_excel() автоматически определяет формат файла и возвращает данные в виде DataFrame (двумерная таблица с метками строк и столбцов).

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

df = pd.read_excel("путь/к/файлу.xlsx", sheet_name="Лист1")

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

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

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

df = pd.read_excel(

"отчет.xlsx",

sheet_name="Данные",

usecols="A:C",

dtype={"Дата": "datetime64", "Сумма": "float64"},

skiprows=3 # Пропустить первые 3 строки

)

⚠️ Внимание: При чтении больших файлов (>100 МБ) pandas может потреблять значительную память. В таких случаях используйте параметр chunksize для постраничного чтения или переходите на openpyxl в режиме read_only.

Установить pandas и движок (openpyxl/xlrd)

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

Указать правильное имя листа (с учётом регистра!)

Определить необходимые столбцы (usecols) для экономии памяти

-->

3. Способ 2: Работа с openpyxl — полный контроль над файлом

openpyxl предоставляет низкоуровневый доступ к структуре файла .xlsx, позволяя читать и редактировать ячейки, формулы, стили и даже создавать новые листы. В отличие от pandas, здесь вы работаете с объектами Workbook, Worksheet и Cell.

Базовый пример чтения:

from openpyxl import load_workbook

wb = load_workbook("пример.xlsx", read_only=True) # Режим только для чтения

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

Чтение ячейки A1

print(sheet["A1"].value)

Итерация по строкам

for row in sheet.iter_rows(values_only=True):

print(row)

Особенности openpyxl:

ПреимуществоОграничение
Поддержка формул и стилейНе работает с .xls
Режим read_only для больших файловМедленнее pandas при чтении данных
Возможность редактирования файлаСинтаксис сложнее для анализа данных
Поддержка диапазонов ячеек (sheet["A1:C10"])Требует явного закрытия файла (wb.close())

Для работы с формулами используйте свойство data_only:

wb = load_workbook("формулы.xlsx", data_only=True)

sheet = wb.active

print(sheet["B2"].value) # Вернёт вычисленное значение, а не формулу

4. Способ 3: xlrd для старых форматов (.xls) и специфических задач

Библиотека xlrd исторически использовалась для чтения файлов .xls, но с 2020 года её поддержка была ограничена. Теперь для работы с .xlsx требуется версия xlrd>=2.0, а для .xls — версия 1.2.0. Это создаёт путаницу, поэтому рассмотрим оба варианта.

Чтение .xls (Excel 97-2003):

import xlrd

wb = xlrd.open_workbook("старый_файл.xls")

sheet = wb.sheet_by_name("Лист1")

Чтение ячейки B3

print(sheet.cell_value(2, 1)) # Номера строк и столбцов с 0

Чтение .xlsx (Excel 2007+):

wb = xlrd.open_workbook("новый_файл.xlsx", on_demand=True)  # Ленивая загрузка

sheet = wb.sheet_by_index(0)

print(sheet.row_values(0)) # Первая строка

⚠️ Внимание: В xlrd>=2.0 поддержка .xls удалена! Если вам нужно работать со старыми файлами, установите xlrd==1.2.0 в отдельное виртуальное окружение. Альтернатива — библиотека pylightxl.

Особенности xlrd:

  • 📅 Поддерживает даты в формате Excel (требует преобразования в datetime).
  • 🔢 Позволяет читать файлы постранично (on_demand=True).
  • 🚫 Не поддерживает запись в файлы (только чтение).
Как преобразовать дату из Excel в Python

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

from xlrd import xldate_as_tuple

from datetime import datetime

date_tuple = xldate_as_tuple(sheet.cell_value(0, 0), wb.datemode)

date = datetime(*date_tuple)

5. Способ 4: pyexcel — универсальный интерфейс для разных форматов

pyexcel — это обёртка над xlrd, openpyxl и другими библиотеками, предоставляющая единый интерфейс для работы с Excel, CSV и другими табличными форматами. Её главное преимущество — простота кода для базовых операций.

Пример чтения файла:

import pyexcel as pe

records = pe.get_records(file_name="данные.xlsx")

for record in records:

print(record["Столбец1"], record["Столбец2"])

Ключевые возможности:

  • 🔄 Автоматическое определение формата файла.
  • 📋 Поддержка чтения/записи в форматы xls, xlsx, csv, ods.
  • 🔄 Методы get_array(), get_dict(), get_records() для разных форматов вывода.

Для записи данных в новый файл:

data = [["Имя", "Возраст"], ["Алексей", 30], ["Мария", 25]]

pe.save_as(array=data, dest_file_name="выход.xlsx")

⚠️ Внимание: pyexcel не поддерживает редактирование существующих файлов — только создание новых или полная перезапись. Для частичных изменений используйте openpyxl.

6. Обработка ошибок и оптимизация производительности

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

Частые ошибки и их причины:

ОшибкаПричинаРешение
XLRDError: Unsupported formatПопытка открыть .xlsx в xlrd==1.2.0Обновите до xlrd>=2.0 или используйте openpyxl
KeyError: "Sheet1"Лист с таким именем отсутствуетПроверьте имя листа через wb.sheetnames
MemoryErrorФайл слишком большой для pandasИспользуйте chunksize или openpyxl в режиме read_only
BadZipFile: File is not a zip fileФайл повреждён или не является .xlsxПопробуйте открыть файл в Excel и сохранить заново

Оптимизация для больших файлов:

  • 🗜 pandas.read_excel(..., chunksize=1000) — чтение файла частями.
  • 🚀 openpyxl.load_workbook(..., read_only=True) — режим только для чтения.
  • 🗃 usecols в pandas — чтение только нужных столбцов.
  • 🔄 dtype — явное указание типов данных для экономии памяти.

7. Продвинутые сценарии: формулы, макросы, защищённые файлы

Стандартные библиотеки не всегда справляются со специфическими форматами Excel. Рассмотрим неочевидные случаи.

Работа с формулами:

  • 📐 В openpyxl формулы читаются как строки. Чтобы получить вычисленное значение, используйте data_only=True (но это требует предварительного открытия файла в Excel для расчёта формул!).
  • 🔢 В pandas формулы автоматически вычисляются при чтении (если файл был сохранён с результатами).

Файлы с макросами (.xlsm):

Для работы с .xlsm используйте openpyxl с параметром keep_vba=True:

wb = load_workbook("макросы.xlsm", keep_vba=True)

Защищённые паролем файлы:

Библиотеки pandas/openpyxl не поддерживают расшифровку защищённых файлов. Используйте msoffcrypto-tool для удаления защиты:

pip install msoffcrypto-tool

from msoffcrypto import OfficeFile

file = OfficeFile(open("защищенный.xlsx", "rb"))

file.load_key(password="ваш_пароль")

file.decrypt(open("распакованный.xlsx", "wb"))

FAQ: Ответы на частые вопросы

Можно ли открыть Excel-файл без установки дополнительных библиотек?

Нет, в стандартной библиотеке Python нет встроенных инструментов для работы с форматами Excel. Минимально потребуется установить openpyxl или pandas.

Как прочитать только первую строку файла, не загружая его полностью?

Используйте openpyxl в режиме read_only и прервите итерацию после первой строки:

from openpyxl import load_workbook

wb = load_workbook("большой_файл.xlsx", read_only=True)

sheet = wb.active

first_row = next(sheet.iter_rows(values_only=True))

print(first_row)

Почему pandas неправильно определяет типы данных (например, даты становятся числами)?

Это происходит из-за внутреннего формата хранения дат в Excel. Укажите тип явно:

df = pd.read_excel("файл.xlsx", parse_dates=["Дата"], dayfirst=True)

Параметр dayfirst=True важен для корректного распознавания дат в формате ДД.ММ.ГГГГ.

Как открыть файл Excel из интернета (по URL) без скачивания?

Используйте библиотеку requests для загрузки файла в память, а затем передайте объект в pandas:

import requests

from io import BytesIO

url = "https://example.com/file.xlsx"

response = requests.get(url)

df = pd.read_excel(BytesIO(response.content))

Можно ли редактировать ячейки по формулам (например, изменить =SUM(A1:A10) на =SUM(A1:A20))?

Да, но только через openpyxl. Пример:

from openpyxl import load_workbook

wb = load_workbook("файл.xlsx")

sheet = wb.active

sheet["B1"].value = "=SUM(A1:A20)" # Замена формулы

wb.save("файл_измененный.xlsx")

Обратите внимание: pandas не сохраняет формулы при записи в Excel — он записывает только вычисленные значения.