Как сделать таблицу Excel в Python: от простых данных до сложных отчётов

Работа с таблицами Excel в Python — одна из самых востребованных задач в автоматизации отчётности, анализе данных и бизнес-процессах. Несмотря на популярность Google Sheets и CSV, формат .xlsx остаётся стандартом де-факто для обмена структурированной информацией между системами. С помощью Python вы можете не только создавать таблицы с нуля, но и редактировать существующие файлы, добавлять формулы, строить графики и даже защищать данные паролем.

Многие ошибочно считают, что для работы с Excel в Python нужны глубокие знания программирования. На самом деле, благодаря специализированным библиотекам вроде openpyxl, pandas или xlsxwriter, даже новичок сможет автоматизировать рутинные задачи за несколько часов. Главное — понимать базовые принципы: как организовать данные в ячейках, как применить стили и как избежать типичных ошибок при экспорте.

В этой статье мы разберём 5 практических способов создания Excel-файлов в Python — от простейших таблиц до многостраничных отчётов с диаграммами. Вы узнаете, какую библиотеку выбрать для конкретной задачи, как оптимизировать код для больших объёмов данных и какие скрытые возможности формата .xlsx часто упускают из виду даже опытные разработчики.

1. Библиотека openpyxl: базовое создание таблиц

Openpyxl — самая популярная библиотека для работы с .xlsx-файлами в Python. Она позволяет создавать таблицы с нуля, редактировать существующие файлы и управлять стилями ячеек. Главное преимущество — простота использования и поддержка всех ключевых функций Excel, включая формулы, условное форматирование и сводные таблицы.

Чтобы установить библиотеку, выполните команду в терминале:

pip install openpyxl

Минимальный пример создания файла с одной таблицей:

from openpyxl import Workbook

Создаём новую книгу

wb = Workbook()

ws = wb.active # Выбираем активный лист

Записываем данные в ячейки

ws['A1'] = "Привет, Excel!"

ws['B2'] = 42

ws['C3'] = "=SUM(B2:B3)" # Формула

Сохраняем файл

wb.save("example_openpyxl.xlsx")

Обратите внимание на синтаксис обращения к ячейкам: ws['A1'] или альтернативно ws.cell(row=1, column=1). Библиотека автоматически определяет тип данных (строка, число, формула), но иногда требуется явное приведение типов для корректного отображения.

⚠️ Внимание: При работе с формулами в openpyxl ячейка должна начинаться со знака =, иначе текст будет воспринят как обычная строка. Например, ws['A1'] = "SUM(B1:B10)" не сработает — нужно ws['A1'] = "=SUM(B1:B10)".
  • 📌 Поддерживает Excel-формулы (более 300 функций)
  • 🎨 Позволяет настраивать стили ячеек (шрифты, цвета, границы)
  • 📊 Умеет создавать простые диаграммы (линейные, столбчатые)
  • 🔄 Может читать и записывать существующие файлы без потери форматирования
📊 Какую библиотеку вы чаще используете для работы с Excel в Python?
openpyxl
pandas
xlsxwriter
Другую
Не работал с Excel в Python

2. Pandas для экспорта DataFrame в Excel

Если вы работаете с данными в формате таблиц (DataFrame), библиотека pandas станет вашим лучшим помощником. Она не только упрощает анализ данных, но и предоставляет удобные методы для экспорта в Excel. Главный плюс — автоматическое форматирование столбцов и строк, поддержка многостраничных книг и интеграция с openpyxl для расширенных функций.

Установка (если ещё не установлен):

pip install pandas openpyxl

Пример экспорта DataFrame в Excel:

import pandas as pd

Создаём DataFrame

data = {

"Продукт": ["Яблоки", "Бананы", "Вишня"],

"Цена": [50, 30, 120],

"Количество": [100, 200, 50]

}

df = pd.DataFrame(data)

Экспортируем в Excel

df.to_excel("products_pandas.xlsx",

sheet_name="Товары",

index=False, # Не сохраняем индексы строк

engine='openpyxl')

Ключевые параметры метода to_excel():

  • 📄 sheet_name — имя листа (по умолчанию 'Sheet1')
  • 🔢 index — сохранять ли индексы строк (False для чистых данных)
  • 📊 startrow/startcol — смещение начала таблицы
  • 🔄 engine — движок для записи ('openpyxl' или 'xlsxwriter')
⚠️ Внимание: При экспорте больших DataFrame (>100 000 строк) pandas может тормозить. В таких случаях лучше использовать xlsxwriter в режиме оптимизации или разбивать данные на несколько листов.
with pd.ExcelWriter("multi_sheet.xlsx", engine='openpyxl') as writer:

df1.to_excel(writer, sheet_name="Лист1")

df2.to_excel(writer, sheet_name="Лист2")

-->

3. XlsxWriter: оптимизация для больших данных

Когда речь идёт о крупных наборах данных (десятки тысяч строк) или необходимости тонкой настройки форматирования, xlsxwriter становится лучшим выбором. Эта библиотека оптимизирована для производительности и поддерживает расширенные функции Excel, такие как:

  • 📈 Условное форматирование (цветовые шкалы, значки)
  • 🔒 Защита листов и книг паролем
  • 📊 Сложные диаграммы (спарклайны, тепловые карты)
  • 🖼️ Вставка изображений и объектов

Установка:

pip install xlsxwriter

Пример создания файла с форматированием:

import xlsxwriter

Создаём книгу и добавляем лист

workbook = xlsxwriter.Workbook('large_data.xlsx')

worksheet = workbook.add_worksheet("Данные")

Определяем форматы

bold = workbook.add_format({'bold': True})

money_format = workbook.add_format({'num_format': '#,##0.00 ₽'})

Записываем заголовки

worksheet.write('A1', 'Продукт', bold)

worksheet.write('B1', 'Цена', bold)

worksheet.write('C1', 'Продажи', bold)

Записываем данные с форматом

worksheet.write('A2', 'Ноутбук')

worksheet.write('B2', 45000, money_format)

worksheet.write('C2', 15)

workbook.close()

XlsxWriter не умеет редактировать существующие файлы (только создавать новые), но зато предлагает уникальные возможности:

  • 🔹 Динамические массивы (Excel Tables)
  • 📌 Автофильтры для больших таблиц
  • 📱 Оптимизация для мобильных устройств (адаптивные видеты)
Как ускорить запись больших данных?

Используйте метод worksheet.write_row() или write_column() вместо поэлементной записи. Также помогает отключение автоматического пересчёта формул:

workbook.set_calc_mode('manual')

4. Работа с формулами и вычислениями

Одной из ключевых особенностей Excel являются формулы, и Python позволяет их полноценно использовать. Все три рассмотренные библиотеки поддерживают вставку формул, но есть нюансы:

Библиотека Поддержка формул Автопересчёт Ограничения
openpyxl Полная (300+ функций) Да (по умолчанию) Медленный пересчёт больших таблиц
pandas Через openpyxl/xlsxwriter Зависит от движка Не поддерживает массивы формул
xlsxwriter Полная + пользовательские функции Ручной/автоматический Не читает существующие формулы

Пример добавления формул в openpyxl:

from openpyxl import Workbook

from openpyxl.utils import get_column_letter

wb = Workbook()

ws = wb.active

Записываем данные

ws['A1'] = 10

ws['B1'] = 20

ws['C1'] = "=A1+B1" # Простая формула

Формула с использованием функции

ws['A2'] = 5

ws['B2'] = 15

ws['C2'] = f"=SUM(A1:B2)"

Формула с абсолютной ссылкой

ws['A3'] = "=A$1*2"

wb.save("formulas.xlsx")

Для работы с динамическими диапазонами (например, =SUM(Таблица1!A:A)) используйте именованные диапазоны:

from openpyxl.workbook import defined_name

Создаём именованный диапазон

wb.defined_names.definedName('MyRange').value = "Sheet1!$A$1:$A$100"

ws['B1'] = "=SUM(MyRange)"

⚠️ Внимание: Формулы в Excel чувствительны к локализации. Если ваша система использует русскую версию Excel, замените SUM на СУММ, а запятые в аргументах — на точку с запятой: =СУММ(A1;B1).

5. Добавление диаграмм и графиков

Визуализация данных — неотъемлемая часть отчётности. Все три библиотеки поддерживают создание диаграмм, но xlsxwriter и openpyxl предлагают больше возможностей для настройки. Рассмотрим пример добавления столбчатой диаграммы с помощью openpyxl:

from openpyxl import Workbook

from openpyxl.chart import BarChart, Reference

wb = Workbook()

ws = wb.active

Данные для диаграммы

rows = [

["Год", "Продажи"],

[2020, 150],

[2021, 200],

[2022, 250]

]

for row in rows:

ws.append(row)

Создаём диаграмму

chart = BarChart()

data = Reference(ws, min_col=2, min_row=1, max_row=4, max_col=2)

categories = Reference(ws, min_col=1, min_row=2, max_row=4)

chart.add_data(data, titles_from_data=True)

chart.set_categories(categories)

Добавляем диаграмму на лист

ws.add_chart(chart, "D2")

wb.save("chart_example.xlsx")

Типы диаграмм, доступные в openpyxl:

  • 📊 Столбчатая (BarChart)
  • 📈 Линейная (LineChart)
  • 🍩 Круговая (PieChart)
  • 📉 С областями (AreaChart)
  • 📍 Точечная (ScatterChart)

Для создания сводных таблиц (PivotTable) в openpyxl используйте класс PivotTable:

from openpyxl.utils import get_column_letter

from openpyxl.workbook.pivot.table import Table

from openpyxl.workbook.pivot.cache import Cache

Создаём кэш данных

cache = Cache(source=ws, top_left_cell="A1", bottom_right_cell="B4")

pt = Table(cache=cache, name="PivotTable1")

Добавляем поля

pt.row_fields = [get_column_letter(1)] # Поле строк (первый столбец)

pt.data_fields = [get_column_letter(2)] # Поле данных (второй столбец)

ws.add_table(pt)

Убедитесь, что данные начинаются с заголовков|Проверьте отсутствие пустых ячеек в диапазоне|Используйте числовые форматы для осей|Назовите лист понятным именем-->

6. Продвинутые возможности: защита, макросы и оптимизация

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

Защита листов и книг паролем

В xlsxwriter можно защитить лист от изменений:

worksheet.protect('password123', {

'objects': True, # Защита объектов

'scenarios': True, # Защита сценариев

'format_cells': False # Разрешить форматирование ячеек

})

Добавление макросов (VBA)

Openpyxl не поддерживает запись макросов напрямую, но вы можете:

  1. Создать файл с макросами вручную в Excel.
  2. Открыть его в openpyxl и модифицировать данные.
  3. Сохранить с тем же именем (макросы сохранятся).

Оптимизация производительности

Для ускорения работы с большими файлами:

  • 🔹 Используйте write_only режим в openpyxl:
    wb = Workbook(write_only=True)
  • 🔹 Отключайте автофильтры и условное форматирование при массовой записи.
  • 🔹 Разбивайте данные на несколько листов (оптимально — до 50 000 строк на лист).

Малоизвестный факт: xlsxwriter поддерживает создание файлов в формате .xlsm (с макросами), но для этого нужно вручную добавить VBA-код после генерации файла с помощью сторонних инструментов.

7. Типичные ошибки и их решения

Даже опытные разработчики сталкиваются с проблемами при работе с Excel в Python. Вот самые распространённые ошибки и способы их избежать:

Ошибка Причина Решение
ValueError: Column index out of range Обращение к несуществующему столбцу Проверьте индексы с помощью ws.max_column
Формулы не пересчитываются Отключён автопересчёт в Excel Включите в настройках Excel: Формулы → Параметры вычислений → Автоматически
Русские буквы отображаются как ???? Неверная кодировка при сохранении Укажите кодировку: wb.save("file.xlsx", encoding='utf-8')
ZipFileBadZipFile: File is not a zip file Файл повреждён или не является .xlsx Проверьте расширение файла и права доступа

Ещё одна частая проблема — некорректное отображение дат. Excel хранит даты как числа (количество дней с 1900 года), поэтому при экспорте из pandas используйте:

df.to_excel("dates.xlsx",

date_format='DD.MM.YYYY', # Формат даты

datetime_format='HH:MM:SS') # Формат времени

⚠️ Внимание: При работе с pandas и большими DataFrame избегайте использования engine='xlrd' — эта библиотека устарела и не поддерживает формат .xlsx для записи. Вместо неё укажите engine='openpyxl'.

8. Автоматизация: от простых скриптов до комплексных решений

Python позволяет автоматизировать не только создание Excel-файлов, но и цепочки действий с ними. Рассмотрим три уровня автоматизации:

Уровень 1: Простые скрипты

Пример: еженедельный экспорт данных из базы в Excel:

import sqlite3

import pandas as pd

Подключаемся к базе

conn = sqlite3.connect('sales.db')

query = "SELECT * FROM orders WHERE date > '2023-01-01'"

df = pd.read_sql(query, conn)

Экспортируем

df.to_excel("weekly_sales.xlsx", index=False)

Уровень 2: Шаблоны с форматированием

Используйте готовые шаблоны .xlsx и заполняйте их данными:

from openpyxl import load_workbook

Загружаем шаблон

wb = load_workbook("template.xlsx")

ws = wb["Отчёт"]

Заполняем динамические данные

ws['B2'] = current_date

ws['D5'] = total_sales

wb.save(f"report_{current_date}.xlsx")

Уровень 3: Комплексные пакетные задачи

Для автоматизации цепочек действий (например, сбор данных → обработка → экспорт → отправка по email) используйте:

  • 📂 Airflow для оркестрации задач
  • 📧 SMTPlib для отправки отчётов по почте
  • 🔄 Celery для распределённых вычислений

Пример отправки сгенерированного отчёта по email:

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

from email import encoders

Создаём письмо

msg = MIMEMultipart()

msg['From'] = "reports@company.com"

msg['To'] = "manager@company.com"

msg['Subject'] = "Ежемесячный отчёт"

Прикрепляем файл

with open("report.xlsx", "rb") as f:

part = MIMEBase('application', 'octet-stream')

part.set_payload(f.read())

encoders.encode_base64(part)

part.add_header('Content-Disposition', 'attachment; filename="report.xlsx"')

msg.attach(part)

Отправляем

with smtplib.SMTP("smtp.company.com", 587) as server:

server.login("user", "password")

server.send_message(msg)

FAQ: Частые вопросы по работе с Excel в Python

Можно ли редактировать существующие файлы .xls (не .xlsx)?

Для работы со старым форматом .xls используйте библиотеку xlrd (только чтение) или xlwt (запись). Однако эти форматы устарели, и мы рекомендуем конвертировать файлы в .xlsx с помощью Excel или LibreOffice.

Как добавить несколько листов в один файл?

В openpyxl и xlsxwriter используйте метод create_sheet():

wb.create_sheet("Лист2")  # Создаёт новый лист

wb.create_sheet("Лист3", 0) # Вставляет лист на первую позицию

В pandas передайте список DataFrame в ExcelWriter.

Почему при открытии файла Excel выдаёт ошибку "Файл повреждён"?

Это происходит по трём причинам:

  1. Файл не был корректно закрыт (забыли вызвать wb.close() или wb.save()).
  2. Конфликт версий библиотек (например, openpyxl 2.x vs 3.x).
  3. Попытка записать данные в защищённый файл или папку.

Решение: обновите библиотеки (pip install --upgrade openpyxl) и проверьте права доступа.

Как экспортировать данные с сохранением форматирования (цвета, шрифты)?

Используйте openpyxl или xlsxwriter для ручной настройки стилей:

from openpyxl.styles import Font, Color, Alignment

Применяем стили

ws['A1'].font = Font(name='Arial', size=12, bold=True, color='FF0000')

ws['A1'].alignment = Alignment(horizontal='center')

В pandas для этого нужно использовать ExcelWriter с openpyxl:

with pd.ExcelWriter("styled.xlsx", engine='openpyxl') as writer:

df.to_excel(writer, sheet_name="Sheet1")

workbook = writer.book

worksheet = writer.sheets["Sheet1"]

# Здесь настраиваем стили для worksheet

Можно ли создать сводную таблицу (PivotTable) в Python?

Да, но с оговорками:

  • В openpyxl сводные таблицы создаются через класс PivotTable, но с ограниченной функциональностью.
  • В pandas проще сделать сводную таблицу в DataFrame (df.pivot_table()), а затем экспортировать результат.
  • Для полноценных сводных таблиц с фильтрами и срезами лучше использовать Excel как шаблон и заполнять его данными из Python.