Библиотеки Python для Excel: практические сценарии и примеры кода

Раздел: Анализ данных -> Библиотеки данных

Работа с Excel-файлами в Python: обзор возможностей

Для взаимодействия с электронными таблицами Excel в Python существует несколько библиотек. Каждая из них имеет свою область применения: от простого чтения и записи до создания сложных отчетов с диаграммами. В этом разделе рассматриваются наиболее популярные решения и их особенности.

Как эффективно читать и обрабатывать большие таблицы Excel?

Оптимальным выбором для анализа данных является библиотека pandas. Она позволяет загружать данные из Excel напрямую в DataFrame, предоставляя мощные инструменты фильтрации, группировки и агрегации. Пример базового чтения:

import pandas as pd

df = pd.read_excel('data.xlsx', sheet_name='Лист1')
print(df.head())

Python pandas пример (примеры pandas в python)

Для записи DataFrame обратно в Excel используется метод to_excel():

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

Python excel примеры (примеры работы с excel в python)

Типичная ошибка: файл не найден или неверный путь. Решение - указывать абсолютный путь или использовать модуль pathlib. Ещё одна проблема - несоответствие типов данных (например, числа читаются как строки). Помогает явное указание dtype при чтении или последующее преобразование столбцов.

Как изменить формат ячейки, добавить стили или объединить ячейки?

Если требуется тонкая настройка внешнего вида таблицы (цвета, границы, шрифты), лучше использовать openpyxl. Эта библиотека работает непосредственно с файлами .xlsx, поддерживает стилизацию и формулы. Пример создания файла с форматированием:

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill

wb = Workbook()
ws = wb.active
ws['A1'] = 'Название'
ws['A1'].font = Font(bold=True, color='FFFFFF')
ws['A1'].fill = PatternFill(start_color='4F81BD', end_color='4F81BD', fill_type='solid')
wb.save('styled.xlsx')

графики python примеры (построение графиков в python)

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

Какая библиотека подходит для создания отчетов с диаграммами и сводными таблицами?

Для генерации сложных отчетов с графиками, условным форматированием и автоматической настройкой столбцов идеально подходит xlsxwriter. Она создает файлы .xlsx с высокой производительностью и гибкостью. Пример добавления диаграммы:

import xlsxwriter

workbook = xlsxwriter.Workbook('chart.xlsx')
worksheet = workbook.add_worksheet()
data = [10, 20, 30, 40, 50]
worksheet.write_column('A1', data)
chart = workbook.add_chart({'type': 'column'})
chart.add_series({'values': '=Sheet1!$A$1:$A$5'})
worksheet.insert_chart('C1', chart)
workbook.close()

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

Как читать старые форматы .xls?

Для файлов формата Excel 97–2003 (.xls) используется пара библиотек xlrd (чтение) и xlwt (запись). Пример чтения:

import xlrd

book = xlrd.open_workbook('old.xls')
sheet = book.sheet_by_index(0)
print(sheet.cell_value(0, 0))

Современные версии xlrd (начиная с 2.0) поддерживают только .xls, не .xlsx. Для .xlsx используйте openpyxl или pandas.

Как объединить несколько листов из разных файлов в один?

С помощью pandas и openpyxl можно собрать данные из множества листов. Пример:

import pandas as pd

all_data = pd.DataFrame()
for file in ['file1.xlsx', 'file2.xlsx']:
    df = pd.read_excel(file, sheet_name=None)
    for sheet_name, data in df.items():
        data['Source'] = f'{file}_{sheet_name}'
        all_data = pd.concat([all_data, data], ignore_index=True)
all_data.to_excel('combined.xlsx', index=False)

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

Ниже представлены более сложные сценарии, которые часто возникают на практике. Каждый пример сопровождается кодом и результатом.

1. Чтение только определённых столбцов и строк с pandas

Пример
import pandas as pd

df = pd.read_excel('inventory.xlsx', 
                   sheet_name='Товары',
                   usecols='A:C',  # только столбцы A,B,C
                   skiprows=2,     # пропустить первые 2 строки
                   nrows=100)      # прочитать только 100 строк
print(df.info())
RangeIndex: 100 entries, 0 to 99
Data columns (total 3 columns):
 ...

2. Добавление условного форматирования через openpyxl

Пример
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
from openpyxl.formatting.rule import CellIsRule

wb = load_workbook('report.xlsx')
ws = wb.active
fill_red = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid')
fill_green = PatternFill(start_color='00FF00', end_color='00FF00', fill_type='solid')

ws.conditional_formatting.add('B2:B20',
                               CellIsRule(operator='greaterThan', formula=['100'], fill=fill_green))
ws.conditional_formatting.add('B2:B20',
                               CellIsRule(operator='lessThan', formula=['50'], fill=fill_red))
wb.save('report_with_conditional.xlsx')

Результат: ячейки со значениями >100 окрашены зелёным, <50 - красным.

3. Создание сводной таблицы с xlsxwriter

Пример
import xlsxwriter

workbook = xlsxwriter.Workbook('pivot.xlsx')
worksheet = workbook.add_worksheet('Data')

# Исходные данные
headers = ['Регион', 'Товар', 'Продажи']
data = [
    ['Москва', 'Товар А', 100],
    ['Москва', 'Товар Б', 150],
    ['СПб', 'Товар А', 80],
    ['СПб', 'Товар Б', 120],
]

for col, header in enumerate(headers):
    worksheet.write(0, col, header)
for row, row_data in enumerate(data, start=1):
    for col, value in enumerate(row_data):
        worksheet.write(row, col, value)

# Сводная таблица
pivot_sheet = workbook.add_worksheet('Pivot')
pivot = workbook.add_pivot_table(pivot_sheet, 'A1')
pivot.add_source_data(worksheet, 'Data', 'A1:C5')
pivot.add_column('Продажи')
pivot.add_row('Регион')
pivot.add_column('Товар')

workbook.close()

После выполнения в файле появится лист 'Pivot' со сводной таблицей, суммирующей продажи по регионам и товарам.

4. Работа с датами: запись и форматирование

Пример
from openpyxl import Workbook
from openpyxl.styles import numbers
from datetime import datetime

wb = Workbook()
ws = wb.active
ws['A1'] = 'Дата'
ws['A2'] = datetime(2025, 3, 15)
ws['A2'].number_format = 'DD.MM.YYYY'  # пользовательский формат

# Формула: разница в днях
ws['B1'] = 'Сегодня'
ws['B2'] = datetime.now()
ws['C1'] = 'Разница (дни)'
ws['C2'] = '=B2-A2'
ws['C2'].number_format = '0'

wb.save('dates.xlsx')

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

5. Чтение и запись нескольких листов с разными именами

Пример
import pandas as pd

# Чтение всех листов в словарь
sheets = pd.read_excel('multi_sheet.xlsx', sheet_name=None)

# Модификация данных второго листа
if 'Отчет2' in sheets:
    sheets['Отчет2']['Новый столбец'] = sheets['Отчет2']['Старый столбец'] * 2

# Запись обратно в новый файл
with pd.ExcelWriter('updated_multi.xlsx', engine='openpyxl') as writer:
    for sheet_name, df in sheets.items():
        df.to_excel(writer, sheet_name=sheet_name, index=False)

Данные всех листов сохраняются, изменения применяются только к выбранному листу.

6. Использование xlrd/xlwt для .xls файлов

Пример
import xlrd
import xlwt

# Чтение
book = xlrd.open_workbook('legacy.xls')
sheet = book.sheet_by_index(0)
header = [sheet.cell_value(0, col) for col in range(sheet.ncols)]

# Создание нового .xls с изменёнными данными
wb = xlwt.Workbook()
ws = wb.add_sheet('Результат')
for col, h in enumerate(header):
    ws.write(0, col, h)
for row in range(1, sheet.nrows):
    for col in range(sheet.ncols):
        ws.write(row, col, sheet.cell_value(row, col))
wb.save('updated_legacy.xls')

Важно: xlwt поддерживает только формат .xls и ограничен 256 столбцами и 65535 строками.

7. Автоматическая подстройка ширины столбцов в openpyxl

Пример
from openpyxl import load_workbook

wb = load_workbook('report.xlsx')
ws = wb.active

for col in ws.columns:
    max_length = 0
    col_letter = col[0].column_letter
    for cell in col:
        if cell.value:
            max_length = max(max_length, len(str(cell.value)))
    adjusted_width = max_length + 2
    ws.column_dimensions[col_letter].width = adjusted_width

wb.save('report_autofit.xlsx')

Ширина каждого столбца устанавливается по самому длинному содержимому с запасом в 2 символа.

Примеры работы с Excel в Python - comments

En
Python excel примеры (python)