Библиотеки 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 символа.