Чтение Excel в Python: полный разбор инструментов
Обзор библиотек для чтения Excel в Python
Как прочитать Excel-файл с минимальным кодом и максимальной гибкостью?
Наиболее эффективное решение - библиотека pandas с методом read_excel(). Она автоматически определяет формат файла, загружает данные в DataFrame, предоставляет мощные инструменты для фильтрации и преобразования. Для работы требуется установить pandas и один из движков (например, openpyxl для .xlsx).
import pandas as pd
df = pd.read_excel('data.xlsx', sheet_name='Лист1')
print(df.head())
Python чтение excel (чтение excel в python)
Данный подход подходит для большинства задач: анализ данных, очистка, экспорт в другие форматы. Цель - быстрое получение таблицы для дальнейшей обработки.
Типичные ошибки:
- FileNotFoundError - файл не найден. Проверить путь и расширение.
- ImportError: Missing optional dependency 'openpyxl' - требуется установить библиотеку командой
pip install openpyxl. - ValueError: Sheet 'Лист1' does not exist - указано неверное имя листа. Использовать
sheet_name=Noneдля загрузки всех листов в словарь.
Как прочитать .xlsx без pandas, используя только openpyxl?
Библиотека openpyxl предназначена для работы с .xlsx. Позволяет читать отдельные ячейки, диапазоны, а также получать форматирование. Подходит, когда не нужен DataFrame, а требуется низкоуровневый доступ.
from openpyxl import load_workbook
wb = load_workbook('data.xlsx', data_only=True)
ws = wb['Лист1']
for row in ws.iter_rows(min_row=1, max_row=5, values_only=True):
print(row)
Цель - чтение с сохранением структуры ячеек (например, для проверки формул или стилей).
Как прочитать старый формат .xls (Excel 97-2003)?
Библиотека xlrd (версия до 2.0) поддерживает .xls. После версии 2.0 поддержка .xls удалена, поэтому для старых файлов используют xlrd==1.2.0.
import xlrd
workbook = xlrd.open_workbook('old_data.xls')
sheet = workbook.sheet_by_index(0)
for row_idx in range(sheet.nrows):
print(sheet.row_values(row_idx))
Цель - обратная совместимость с легаси-файлами.
Ошибки при использовании xlrd:
- При попытке открыть .xlsx возникает
XLRDError: Excel xlsx file; not supported- библиотека не поддерживает .xlsx. - В новых версиях xlrd >=2.0 отсутствует поддержка .xls. Установить старую версию:
pip install xlrd==1.2.0.
Дополнительные варианты: pyxlsb для .xlsb (бинарный формат), xlwings для взаимодействия с Excel COM (Windows). Выбор зависит от формата файла и требуемого уровня доступа.
Расширенные примеры чтения Excel
Пример 1: Чтение нескольких листов с помощью pandas
Файл multi_sheet.xlsx содержит листы 'Продажи', 'Затраты'. Загрузить оба листа в словарь DataFrame.
import pandas as pd
sheets = pd.read_excel('multi_sheet.xlsx', sheet_name=None)
for name, df in sheets.items():
print(f'Лист: {name}')
print(df.head())
Лист: Продажи Дата Сумма 0 2024-01-01 100 1 2024-01-02 150 Лист: Затраты Дата Сумма 0 2024-01-01 80 1 2024-01-02 120
Пример 2: Чтение определённого диапазона ячеек с openpyxl
Таблица расположена в ячейках A1:C10, но нужны только строки 3-6 и столбцы A-B.
from openpyxl import load_workbook
wb = load_workbook('report.xlsx', data_only=True)
ws = wb.active
data = []
for row in ws.iter_rows(min_row=3, max_row=6, min_col=1, max_col=2, values_only=True):
data.append(row)
print(data)
[('Товар A', 34), ('Товар B', 28), ('Товар C', 45), ('Товар D', 19)]
Пример 3: Обработка формул и пропусков с помощью pandas
В файле есть формулы и пустые ячейки. read_excel по умолчанию вычисляет формулы (если файл открыт с data_only=True). Пустые ячейки становятся NaN.
import pandas as pd
df = pd.read_excel('formulas.xlsx', sheet_name='Sheet1', dtype={'Цена': float})
print(df.info())
# Замена NaN на 0
df_filled = df.fillna(0)
print(df_filled.head())
RangeIndex: 5 entries, 0 to 4 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Товар 5 non-null object 1 Цена 4 non-null float64 2 Количество 3 non-null float64 Товар Цена Количество 0 Товар A 100.0 5.0 1 Товар B 200.0 0.0 2 Товар C 150.0 10.0 3 Товар D 180.0 0.0 4 Товар E 220.0 3.0
Пример 4: Чтение больших файлов .xlsb с pyxlsb
Бинарный формат .xlsb экономит место и быстрее читается. Установить pip install pyxlsb.
from pyxlsb import open_workbook
with open_workbook('large_data.xlsb') as wb:
with wb.get_sheet(1) as sheet:
for row in sheet.rows():
print([item.v for item in row])
Результат - вывод последовательности строк с числами и строками.
Пример 5: Чтение скрытых листов и защищённых ячеек
openpyxl позволяет обнаружить скрытые листы через ws.sheet_state. Защищённые ячейки читаются, но запись потребует снятия защиты.
from openpyxl import load_workbook
wb = load_workbook('protected.xlsx', data_only=True)
for ws in wb.worksheets:
if ws.sheet_state == 'hidden':
print(f'Скрытый лист: {ws.title}')
# Чтение данных со скрытого листа
for row in ws.iter_rows(values_only=True):
print(row)
Примечание: Для чтения нескольких форматов удобно использовать универсальную функцию pd.read_excel с указанием движка (engine='openpyxl' для .xlsx, engine='xlrd' для .xls).