Чтение Excel в Python: полный разбор инструментов

Раздел: Работа с файлами -> Чтение Excel

Обзор библиотек для чтения 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).

Чтение Excel в Python - comments

En
Python чтение excel (python)