При попытке загрузить данные из 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.
2. Работа с форматом .xls (устаревший Excel 97-2003)
Файлы с расширением .xls требуют специальной обработки, так как современные версии xlrd (начиная с 2.0.0) не поддерживают этот формат. Решения:
- Установите старую версию xlrd:
```bash
pip install xlrd==1.2.0
```
Затем используйте её как движок:
```python
df = pd.read_excel('old_file.xls', engine='xlrd')
```
- Конвертируйте файл в .xlsx: Используйте LibreOffice или онлайн-конвертеры (например, CloudConvert).
- Используйте 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()
```
Сравнение библиотек:
| Критерий | pandas | openpyxl | xlwings |
|---|---|---|---|
| Поддержка формул | ❌ Нет | ✅ Да | ✅ Да |
| Работа с макросами | ❌ Нет | ❌ Нет | ✅ Да |
| Скорость чтения | ⚡ Быстро | 🐢 Медленно | 🐢 Медленно |
| Кросс-платформенность | ✅ Да | ✅ Да | ❌ Только 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 может интерпретировать числа как даты (например, 44197 → 2021-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'). - Лист скрыт — проверьте в Excel ("Формат" → "Скрыть/отобразить").
- Лист защищён паролем — используйте 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).