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

При попытке загрузить данные из Excel-файла в Python с помощью стандартных методов часто возникает ошибка ModuleNotFoundError: No module named 'xlrd' — даже если вы установили библиотеку pandas. Проблема кроется в том, что начиная с версии xlrd 2.0.0 (январь 2022) поддержка форматов .xls была вынесена в отдельный пакет xlrd<=1.2.0, а для .xlsx требуется openpyxl или odfpy. Чтобы избежать конфликтов, необходимо явно указать движок при чтении файла: pd.read_excel('file.xlsx', engine='openpyxl').

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

1. Базовый импорт с помощью pandas.read_excel()

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

```python

import pandas as pd

Чтение файла с явным указанием движка

df = pd.read_excel(

'data.xlsx',

engine='openpyxl', # для .xlsx

sheet_name='Лист1' # имя листа (или индекс: 0)

)

print(df.head())

```

Ключевые параметры функции:

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

Если файл содержит несколько листов, можно загрузить их все в словарь DataFrame:

```python

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

Доступ к листу: all_sheets['Лист1']

```

⚠️ Внимание: При чтении больших файлов (>100 МБ) pandas может потреблять значительную память. Для оптимизации используйте параметр chunksize (постраничная загрузка) или библиотеку dask.
📊 Какую библиотеку вы чаще используете для работы с Excel в Python?
pandas
openpyxl
xlrd
Другую

2. Работа с форматом .xls (устаревший Excel 97-2003)

Файлы с расширением .xls требуют специальной обработки, так как современные версии xlrd (начиная с 2.0.0) не поддерживают этот формат. Решения:

  1. Установите старую версию xlrd:

    ```bash

    pip install xlrd==1.2.0

    ```

    Затем используйте её как движок:

    ```python

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

    ```

  2. Конвертируйте файл в .xlsx: Используйте LibreOffice или онлайн-конвертеры (например, CloudConvert).
  3. Используйте pyxlsb для .xlsb: Для двоичных файлов Excel (.xlsb) установите:

    ```bash

    pip install pyxlsb

    ```

    и читайте файл через:

    ```python

    from pyxlsb import open_workbook

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

    data = wb.get_sheet(1).used_range.value

    ```

Сравнение библиотек для работы с .xls:

БиблиотекаПоддержка .xlsСкоростьПамятьУстановка
xlrd==1.2.0✅ ДаСредняяНизкаяpip install xlrd==1.2.0
openpyxl❌ НетВысокаяСредняяpip install openpyxl
pandas + xlrd✅ ДаНизкаяВысокаяpip install pandas xlrd==1.2.0
pyxlsb✅ Только .xlsbВысокаяНизкаяpip install pyxlsb
⚠️ Внимание: Если при открытии .xls возникает ошибка XLRDError: Unsupported format, проверьте расширение файла — возможно, это не Excel, а CSV в формате Excel (попробуйте переименовать в .csv и открыть через pd.read_csv()).

3. Чтение больших файлов Excel с оптимизацией памяти

При работе с файлами объёмом >500 МБ стандартный pd.read_excel() может вызвать MemoryError. Решения для оптимизации:

Используйте параметр chunksize для постраничной загрузки|

Укажите явные типы данных (dtype) для столбцов|

Отключите индексацию (index_col=False)|

Читайте только нужные столбцы (usecols)|-->

Способ 1: Постраничная загрузка (chunksize)

```python

chunk_iter = pd.read_excel(

'large_file.xlsx',

engine='openpyxl',

chunksize=10000, # загружать по 10 000 строк

sheet_name='Data'

)

for chunk in chunk_iter:

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

```

Способ 2: Указание типов данных (dtype)

Автоматическое определение типов (infer) замедляет чтение. Явное задание dtype ускоряет процесс на 30-40%:

```python

df = pd.read_excel(

'file.xlsx',

dtype={

'ID': 'int32',

'Name': 'category', # для строк с повторяющимися значениями

'Price': 'float32'

},

engine='openpyxl'

)

```

Способ 3: Использование dask для распределённой обработки

```python

import dask.dataframe as dd

ddf = dd.read_excel(

'huge_file.xlsx',

engine='openpyxl',

sheet_name='Sheet1'

)

Обработка выполняется лениво (lazy evaluation)

result = ddf.groupby('Column1').mean().compute()

```

Критическое замечание: При чтении файлов >1 ГБ даже с chunksize может потребоваться увеличение лимита памяти Python. В таких случаях рассмотрите альтернативные форматы (например, .parquet) или базы данных (SQLite).

4. Редактирование и запись данных обратно в Excel

Для записи DataFrame в Excel используйте to_excel(). Важные нюансы:

  • 📝 По умолчанию данные записываются на первый лист. Чтобы добавить данные на существующий лист, используйте mode='a' (только с openpyxl).
  • 🎨 Для форматирования ячеек (цвета, шрифты) требуется openpyxl или xlsxwriter.
  • 🔄 При записи в существующий файл без mode='a' он будет перезаписан.

Пример записи с форматированием:

```python

from openpyxl import load_workbook

from openpyxl.styles import Font, PatternFill

Запись DataFrame в новый файл

df.to_excel('output.xlsx', index=False, engine='openpyxl')

Добавляем форматирование

wb = load_workbook('output.xlsx')

ws = wb.active

Жирный шрифт для заголовков

for cell in ws[1]:

cell.font = Font(bold=True)

Зеленая заливка для ячеек с положительными значениями

for row in ws.iter_rows(min_row=2, values_only=False):

if row[2].value > 0: # Предположим, 3-й столбец содержит числа

row[2].fill = PatternFill(start_color='90EE90', fill_type='solid')

wb.save('output_formatted.xlsx')

```

Ошибки при записи и их решения:

ОшибкаПричинаРешение
ValueError: Excel file is not a zip fileФайл повреждён или не является .xlsxСохраните файл заново в Excel или используйте .xls
PermissionError: [Errno 13]Файл открыт в другой программеЗакройте файл в Excel или используйте mode='a'
KeyError: "Sheet 'Лист1' already exists"Повторное создание листаУдалите лист перед записью: del wb['Лист1']

```python

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)

```-->

5. Альтернативные библиотеки: openpyxl и xlwings

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

openpyxl — для низкоуровневой работы с .xlsx

```python

from openpyxl import load_workbook

wb = load_workbook('file.xlsx')

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

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

print(sheet['A1'].value)

Запись в ячейку B2

sheet['B2'] = 'Новое значение'

Сохранение изменений

wb.save('modified.xlsx')

```

xlwings — для взаимодействия с Excel через COM (Windows)

Позволяет управлять Excel как приложением (например, обновлять графики в реальном времени):

```python

import xlwings as xw

Подключение к открытой книге

wb = xw.books.active # или xw.books.open('file.xlsx')

Чтение диапазона

data = wb.sheets['Лист1'].range('A1:C10').value

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

wb.sheets['Лист1'].range('D1').value = [[1, 2], [3, 4]]

Выполнение макроса

wb.macro('Макрос1')()

wb.save()

wb.close()

```

Сравнение библиотек:

Критерийpandasopenpyxlxlwings
Поддержка формул❌ Нет✅ Да✅ Да
Работа с макросами❌ Нет❌ Нет✅ Да
Скорость чтения⚡ Быстро🐢 Медленно🐢 Медленно
Кросс-платформенность✅ Да✅ Да❌ Только Windows/macOS
⚠️ Внимание: Библиотека xlwings требует установленного Microsoft Excel на компьютере. Для серверных решений (Linux) она не подходит — используйте openpyxl или pandas.
Как ускорить чтение Excel-файлов в 2 раза?

Используйте параметр engine='pyxlsb' для двоичных файлов (.xlsb) или конвертируйте файл в .csv перед чтением:

```python

Конвертация в CSV через pandas

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

df.to_csv('large.csv', index=False)

Чтение CSV (в 2-3 раза быстрее)

df = pd.read_csv('large.csv')

```

6. Обработка ошибок и типичные проблемы

Распространённые ошибки при импорте Excel в Python и их решения:

1. Ошибка кодировки (UnicodeDecodeError)

Возникает при чтении файлов с нестандартной кодировкой (например, windows-1251). Решение:

```python

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

```

2. Несоответствие типов данных (DtypeWarning)

Excel может интерпретировать числа как даты (например, 441972021-01-01). Чтобы избежать автоматического преобразования:

```python

df = pd.read_excel(

'file.xlsx',

engine='openpyxl',

dtype={'СтолбецСДатами': str} # привести к строковому типу

)

Затем конвертируйте вручную:

df['СтолбецСДатами'] = pd.to_datetime(df['СтолбецСДатами'], errors='coerce')

```

3. Повреждённые файлы (ZipFileBadZipFile)

Если файл не открывается ни в Python, ни в Excel:

  • 🛠 Попробуйте восстановить файл через Excel ("Файл" → "Открыть" → "Восстановить").
  • 🔄 Сохраните файл в другом формате (например, .csv) через LibreOffice.
  • 📂 Используйте библиотеку olefile для извлечения данных из повреждённых .xls:

    ```bash

    pip install olefile

    ```

4. Ошибка слияния ячеек (MergeCellError)

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

```python

Чтение с игнорированием объединённых ячеек

df = pd.read_excel('file.xlsx', engine='openpyxl', skiprows=lambda x: x > 0 and any(cell.merge_cell for cell in ws[x]))

```

- Откройте файл в Excel и убедитесь, что данные начинаются с первой строки.

- Проверьте наличие объединённых ячеек, скрытых листов или защищённых диапазонов.

- Убедитесь, что в названиях листов нет специальных символов (например, : или ?).-->

7. Автоматизация: чтение нескольких файлов из папки

Для обработки множества Excel-файлов используйте модуль glob или os:

Пример 1: Объединение всех файлов в одну таблицу

```python

import glob

import pandas as pd

Получаем список всех .xlsx файлов в папке

file_list = glob.glob('data/*.xlsx')

Чтение и объединение

dfs = []

for file in file_list:

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

dfs.append(df)

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

```

Пример 2: Обработка файлов с разной структурой

Если файлы имеют разные столбцы, используйте align или явно укажите общие столбцы:

```python

common_columns = ['ID', 'Name', 'Value'] # Общие столбцы

dfs = []

for file in file_list:

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

dfs.append(df)

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

```

Пример 3: Параллельная обработка (ускорение в 4-8 раз)

Для ускорения используйте multiprocessing или concurrent.futures:

```python

from concurrent.futures import ProcessPoolExecutor

import pandas as pd

def read_file(file):

return pd.read_excel(file, engine='openpyxl')

file_list = glob.glob('data/*.xlsx')

with ProcessPoolExecutor() as executor:

dfs = list(executor.map(read_file, file_list))

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

```

Для обработки файлов с одинаковой структурой можно использовать dask:

```python

import dask.dataframe as dd

ddf = dd.read_excel('data/*.xlsx', engine='openpyxl')

result = ddf.compute() # Преобразование в pandas.DataFrame

```

FAQ: Частые вопросы по импорту Excel в Python

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

Без внешних библиотек можно прочитать только .csv (через встроенный модуль csv). Для Excel обязательно нужна хотя бы одна из библиотек: pandas, openpyxl, xlrd или pyxlsb.

Минимальный набор для начала:

```bash

pip install pandas openpyxl

```

❓ Почему pandas не видит лист в Excel-файле?

Возможные причины:

  1. Опечатка в названии листа (регистр имеет значение: 'лист1''Лист1').
  2. Лист скрыт — проверьте в Excel ("Формат" → "Скрыть/отобразить").
  3. Лист защищён паролем — используйте openpyxl для разблокировки:

    ```python

    from openpyxl import load_workbook

    wb = load_workbook('file.xlsx')

    wb.security = None # Снятие защиты

    wb.save('unlocked.xlsx')

    ```

❓ Как импортировать данные из Excel с сохранением формул?

Pandas не поддерживает чтение формул — только их результаты. Для работы с формулами используйте:

Вариант 1: openpyxl

```python

from openpyxl import load_workbook

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

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

print(sheet['A1'].value) # Вернёт формулу, например "=SUM(B1:B10)"

```

Вариант 2: xlwings (только Windows/macOS)

```python

import xlwings as xw

wb = xw.books.open('file.xlsx')

print(wb.sheets['Лист1'].range('A1').formula)

```

❓ Можно ли импортировать данные из Excel Online или Google Sheets?

Да, для этого используйте:

  • Google Sheets: Экспортируйте файл в .xlsx через меню "Файл" → "Скачать" → "Excel (.xlsx)", затем читайте как обычно. Или используйте API:

    ```python

    import gspread

    from oauth2client.service_account import ServiceAccountCredentials

    scope = ['https://spreadsheets.google.com/feeds']

    creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)

    client = gspread.authorize(creds)

    sheet = client.open('Имя таблицы').sheet1

    data = sheet.get_all_records()

    ```

  • Excel Online: Скачайте файл локально или используйте Microsoft Graph API (требует авторизации).
❓ Как импортировать данные из Excel с сохранением форматирования (цвета, шрифты)?

Pandas не сохраняет форматирование. Для этого:

Способ 1: openpyxl + ручная обработка

```python

from openpyxl import load_workbook

from openpyxl.styles import PatternFill, Font

wb = load_workbook('file.xlsx')

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

# Чтение данных с форматированием

for row in sheet.iter_rows():

for cell in row:

print(f"Значение: {cell.value}, Цвет фона: {cell.fill.start_color.index}")

```

Способ 2: xlwings (только для Windows/macOS)

```python

import xlwings as xw

wb = xw.books.open('file.xlsx')

sheet = wb.sheets['Лист1']

print(sheet.range('A1').color) # Цвет шрифта

print(sheet.range('A1').api.Font.Bold) # Жирный шрифт (True/False)

```

Для сохранения форматирования при записи используйте openpyxl с явным заданием стилей (см. раздел 4).