Таблицы Excel в Python: варианты решений и практические советы

Раздел: Обработка данных -> Работа с Excel

Работа с таблицами Excel в Python: обзор библиотек и подходов

Python предоставляет несколько библиотек для создания, чтения и редактирования файлов Excel (.xlsx, .xls). Выбор подходящего инструмента зависит от задачи: от простой записи данных до автоматизации сложных отчётов с графиками и форматированием.

Основное и наиболее эффективное решение: Pandas + openpyxl

Для большинства сценариев обработки табличных данных (чтение, фильтрация, агрегация, запись) оптимально использовать библиотеку pandas в связке с openpyxl (для файлов .xlsx). Pandas предоставляет высокоуровневый интерфейс DataFrame, а openpyxl служит движком для записи.


import pandas as pd

# Чтение данных из Excel
df = pd.read_excel('data.xlsx', sheet_name='Лист1')

# Обработка (например, фильтр)
df_filtered = df[df['Возраст'] > 30]

# Запись обратно с сохранением форматирования
df_filtered.to_excel('result.xlsx', index=False, engine='openpyxl')
  

код python в excel (код python в excel)

Типичные проблемы:

  • Ошибка ModuleNotFoundError: No module named 'openpyxl' – библиотека не установлена. Решение: pip install openpyxl.
  • При чтении .xls файлов pandas по умолчанию использует xlrd; для .xlsx – openpyxl. Если openpyxl не установлен, возникнет ошибка. Установите pip install xlrd для старых форматов.
  • Проблемы с кодировкой русских символов – обычно решаются указанием encoding='utf-8' при записи, но не для Excel. Для Excel кодировка определяется автоматически.

Цель: быстрая обработка и анализ данных, подходит для дашбордов и отчётов.

Как создать Excel-файл с нуля без pandas?

Используйте библиотеку openpyxl, если нужен полный контроль над форматом, стилями, объединением ячеек или формулами.


from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "Продажи"

ws['A1'] = 'Товар'
ws['B1'] = 'Количество'
ws['C1'] = 'Цена'

ws.append(['Яблоки', 10, 50])
ws.append(['Груши', 5, 70])

wb.save('my_shop.xlsx')
  

Python работа с таблицами excel (работа с таблицами excel в python)

Частая ошибка:

При повторном сохранении в тот же файл без закрытия рабочей книги может возникнуть повреждение. Всегда завершайте запись вызовом wb.save() после окончания изменений.

Цель: создание отчётов с точным форматированием, вставка диаграмм, условное форматирование.

Как записать большой объём данных в Excel с высокой производительностью?

Библиотека xlsxwriter оптимизирована для записи больших файлов и поддерживает множество настроек.


import xlsxwriter

workbook = xlsxwriter.Workbook('big_data.xlsx')
worksheet = workbook.add_worksheet('Данные')

# Формат для заголовков
header_format = workbook.add_format({'bold': True, 'bg_color': '#C0C0C0'})

worksheet.write_row('A1', ['ID', 'Имя', 'Значение'], header_format)
for i in range(2, 100002):
    worksheet.write(i-1, 0, i)
    worksheet.write(i-1, 1, f'Запись {i}')
    worksheet.write(i-1, 2, i * 10)

workbook.close()
  

Excel скрипты python (скрипты python для excel)

Проблема:

xlsxwriter не может читать или редактировать существующие файлы. Он только создаёт новые. Для модификации используйте openpyxl.

Цель: генерация больших Excel-отчётов (сотни тысяч строк) с минимальным временем.

Как работать со старым форматом .xls (Excel 97-2003)?

Для чтения старых файлов используйте xlrd, для записи – xlwt. Библиотеки ограничены по функционалу (нет поддержки .xlsx).


import xlrd

workbook = xlrd.open_workbook('old_data.xls')
sheet = workbook.sheet_by_index(0)
for row in range(sheet.nrows):
    print(sheet.row_values(row))
  

Python сохранить в excel (сохранение данных в excel с помощью python)

Ошибка:

xlrd начиная с версии 2.0 не поддерживает .xls, только .xlsx. Для старых форматов установите версию 1.2.0: pip install xlrd==1.2.0.

Цель: поддержка устаревшего формата .xls (например, для совместимости с legacy-системами).

Как упростить чтение/запись Excel с помощью одной библиотеки?

pyexcel предоставляет единый интерфейс для разных форматов (xlsx, xls, ods, csv). Подходит для конвертации.


import pyexcel as pe

# Чтение
records = pe.get_records(file_name='data.xlsx')
# Запись
pe.save_as(array=records, dest_file_name='copy.xlsx')
  

Python таблица excel (таблица excel в python)

Недостаток:

pyexcel может не поддерживать сложные стили или формулы. Для простых операций – удобен.

Цель: быстрая конвертация между форматами, простые CRUD-операции.

Как читать Excel-файлы с большим количеством листов или объединёнными ячейками?

Для сложной навигации по структуре файла (объединённые ячейки, скрытые строки, комментарии) openpyxl остаётся лучшим выбором.


from openpyxl import load_workbook

wb = load_workbook('complex.xlsx', data_only=True)  # data_only=True для значений формул
ws = wb['Сложный лист']

# Чтение объединённых ячеек
for merged_cell in ws.merged_cells.ranges:
    print(merged_cell, ws[merged_cell.min_row][merged_cell.min_col].value)
  

Проблема:

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

Цель: детальная работа со структурой Excel, извлечение метаданных.

Выбор библиотеки зависит от конкретной задачи: pandas ускоряет анализ, openpyxl даёт полный контроль, xlsxwriter – производительность, xlrd/xlwt – поддержка старых форматов, pyexcel – универсальность.

Расширенные примеры работы с Excel в Python

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

Пример 1: Условное форматирование с openpyxl

Создадим файл с цветовой шкалой для столбца 'Результат'.

Пример

from openpyxl import Workbook
from openpyxl.styles import Color, PatternFill, Font, Border
from openpyxl.formatting.rule import CellIsRule, FormulaRule

wb = Workbook()
ws = wb.active
ws.title = 'Условное форматирование'
ws.append(['Имя', 'Результат'])

# Данные
data = [('Анна', 85), ('Борис', 45), ('Виктор', 92), ('Галина', 38)]
for row in data:
    ws.append(row)

# Определяем заливку для ячеек, где Результат >= 70
highlight = PatternFill(start_color='90EE90', end_color='90EE90', fill_type='solid')
lowlight = PatternFill(start_color='FFC0CB', end_color='FFC0CB', fill_type='solid')

# Применяем условное форматирование ко всем ячейкам с результатом (диапазон B2:B5)
ws.conditional_formatting.add(
    'B2:B5',
    CellIsRule(operator='greaterThanOrEqual', formula=['70'], fill=highlight)
)
ws.conditional_formatting.add(
    'B2:B5',
    CellIsRule(operator='lessThan', formula=['60'], fill=lowlight)
)

wb.save('conditional_formatting.xlsx')
Файл conditional_formatting.xlsx создан. Ячейки со значением >= 70 – зелёные, < 60 – розовые.

Пример 2: Создание диаграммы с xlsxwriter

Построим столбчатую диаграмму прямо в Excel-файле.

Пример

import xlsxwriter

workbook = xlsxwriter.Workbook('chart_example.xlsx')
worksheet = workbook.add_worksheet('График')

# Данные
headings = ['Месяц', 'Продажи']
data = [
    ['Янв', 'Фев', 'Мар', 'Апр', 'Май'],
    [120, 150, 80, 200, 170]
]

worksheet.write_row('A1', headings)
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])

# Диаграмма
chart = workbook.add_chart({'type': 'column'})
chart.add_series({
    'name': '=График!$B$1',
    'categories': '=График!$A$2:$A$6',
    'values': '=График!$B$2:$B$6',
})
chart.set_title({'name': 'Продажи по месяцам'})
chart.set_x_axis({'name': 'Месяц'})
chart.set_y_axis({'name': 'Продажи (шт)'})

worksheet.insert_chart('D2', chart)

workbook.close()
Создан файл chart_example.xlsx с диаграммой на листе 'График'.

Пример 3: Объединение ячеек и вставка многострочного текста в openpyxl

Пример

from openpyxl import Workbook
from openpyxl.styles import Alignment

wb = Workbook()
ws = wb.active

# Объединение ячеек A1:C1
ws.merge_cells('A1:C1')
cell = ws['A1']
cell.value = 'Отчёт о продажах\nза первый квартал'
cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)

# Заполняем заголовки столбцов
ws['A2'] = 'Товар'
ws['B2'] = 'Количество'
ws['C2'] = 'Сумма'

ws.append(['Столы', 4, 20000])
ws.append(['Стулья', 15, 7500])

# Устанавливаем высоту первой строки
ws.row_dimensions[1].height = 40

wb.save('merged_example.xlsx')
Файл merged_example.xlsx содержит объединённую ячейку с переносом текста.

Пример 4: Работа с формулами и автозаполнением

Добавим колонку с вычислением налога (20%) с помощью формул Excel.

Пример

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active
ws.title = 'Формулы'
ws.append(['Товар', 'Цена', 'Налог 20%'])
ws.append(['Ноутбук', 50000])
ws.append(['Мышь', 1200])
ws.append(['Клавиатура', 2500])

# В столбец C вводим формулу =B*0.2
for row in range(2, 5):
    ws.cell(row=row, column=3).value = f'=B{row}*0.2'

# Автосумма итога
ws.cell(row=5, column=2).value = '=SUM(B2:B4)'
ws.cell(row=5, column=3).value = '=SUM(C2:C4)'

wb.save('formulas.xlsx')
При открытии в Excel формулы автоматически вычисляются: налог = 20% от цены, итоги суммируются.

Пример 5: Чтение данных из защищённого паролем Excel-файла

openpyxl не поддерживает защиту паролем. Для открытия защищённых файлов используйте msoffcrypto-tool (для .xls) или VBA (не в Python). Однако можно попробовать снять защиту с помощью external-утилит. Пример с msoffcrypto-tool (только для .xls!):

Пример

import msoffcrypto
import io
import openpyxl

# Подготовка временного файла
with open('protected.xls', 'rb') as f:
    encrypted = msoffcrypto.OfficeFile(f)
    encrypted.load_key('password123')
    decrypted = io.BytesIO()
    encrypted.decrypt(decrypted)

# Теперь можно прочитать openpyxl (только если формат .xls? нет, openpyxl не читает .xls)
# Для .xls используйте xlrd
import xlrd

decrypted.seek(0)
workbook = xlrd.open_workbook(file_contents=decrypted.read())
sheet = workbook.sheet_by_index(0)
print(sheet.cell_value(0, 0))
Выведено значение первой ячейки из расшифрованного файла.

Эти примеры демонстрируют широкие возможности Python для автоматизации Excel, от простого переноса данных до сложных отчётов с визуализацией.

Таблица Excel в Python - comments

En
Python таблица excel (python)