Как записать данные в Excel с помощью Python: полное руководство

При попытке записать данные в Excel через Python вы получаете ошибку ModuleNotFoundError: No module named 'openpyxl' или пустой файл с расширением .xlsx? Проблема чаще всего кроется в неправильной установке библиотек или неверном указании параметров сохранения. Например, если вы используете workbook.save('data.xlsx') без предварительного создания листа, файл создастся, но будет содержать только метаданные без данных.

В 90% случаев для записи в Excel достаточно двух библиотек: openpyxl (для формата .xlsx) и xlwt (для устаревшего .xls). Однако при работе с большими наборами данных (>10 000 строк) лучше использовать pandas — он оптимизирует память и ускоряет запись в 3-5 раз. В этой статье разберём все актуальные методы с примерами кода, включая обработку ошибок и тонкую настройку форматирования ячеек.

1. Подготовка среды: какие библиотеки нужны для работы с Excel

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

  • 📊 openpyxl — для работы с .xlsx (Excel 2010+). Поддерживает стили, формулы, сводные таблицы.
  • 📉 xlwt — только для .xls (Excel 97-2003). Устарел, но ещё используется в legacy-системах.
  • 🐼 pandas — универсальный инструмент для анализа данных. Использует openpyxl или xlsxwriter под капотом.
  • xlsxwriter — оптимизирован для скорости записи больших файлов (миллионы строк).

Установите нужные пакеты через pip:

pip install openpyxl pandas xlsxwriter

Для xlwt (если нужен .xls):

pip install xlwt

⚠️ Внимание: Если вы работаете с .xls, учитывайте ограничение в 65 536 строк на лист. Для больших данных используйте только .xlsx.

После установки проверьте версии библиотек:

import openpyxl

import pandas as pd

print(f"openpyxl: {openpyxl.__version__}, pandas: {pd.__version__}")

2. Базовый метод: запись данных через openpyxl

Библиотека openpyxl позволяет создавать файлы Excel с нуля или редактировать существующие. Минимальный рабочий пример:

from openpyxl import Workbook

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

wb = Workbook()

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

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

ws['A1'] = "Пример данных"

ws.append([1, 2, 3]) # Добавляем строку

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

wb.save("example.xlsx")

Ключевые моменты:

  • 📌 Workbook() создаёт новую книгу с одним листом (Sheet).
  • 📌 ws['A1'] — доступ к ячейке по адресу (столбец + строка).
  • 📌 ws.append() добавляет строку в конец листа.
  • 📌 wb.save() сохраняет изменения. Если файл существует, он будет перезаписан.
⚠️ Внимание: При работе с существующими файлами используйте load_workbook() вместо Workbook(), иначе данные будут утеряны.

Для записи формул используйте знак =:

ws['A2'] = "=SUM(B1:B10)"  # Запишет формулу, а не текст

3. Запись данных через pandas: быстро и просто

Если данные хранятся в DataFrame, pandas упрощает запись в Excel до одной строки:

import pandas as pd

Создаём DataFrame

data = {

"Имя": ["Алексей", "Мария", "Иван"],

"Возраст": [28, 34, 23],

"Город": ["Москва", "СПб", "Казань"]

}

df = pd.DataFrame(data)

Сохраняем в Excel

df.to_excel("users.xlsx", index=False, sheet_name="Лист1")

Параметры метода to_excel():

ПараметрОписаниеПример
indexЗаписывать индексы строкindex=False
sheet_nameИмя листа (макс. 31 символ)sheet_name="Отчёт"
startrowСтрока, с которой начнётся записьstartrow=3
engineДвижок для записи (openpyxl или xlsxwriter)engine='xlsxwriter'

Для записи на несколько листов используйте ExcelWriter:

with pd.ExcelWriter("multi_sheet.xlsx") as writer:

df.to_excel(writer, sheet_name="Лист1", index=False)

df.to_excel(writer, sheet_name="Лист2", index=False) # Те же данные на другой лист

📊 Какую библиотеку вы используете для работы с Excel в Python?
openpyxl
pandas
xlsxwriter
xlwt
Другую

4. Оптимизация для больших данных: xlsxwriter

Если вам нужно записать >100 000 строк, xlsxwriter работает в 2-3 раза быстрее openpyxl. Пример:

import xlsxwriter

Создаём книгу и лист

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

worksheet = workbook.add_worksheet()

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

worksheet.write('A1', 'ID')

worksheet.write('B1', 'Значение')

Записываем 100 000 строк

for i in range(1, 100001):

worksheet.write(i, 0, i) # Столбец A

worksheet.write(i, 1, i * 10) # Столбец B

workbook.close()

Ключевые преимущества xlsxwriter:

  • Скорость: оптимизирован для больших файлов.
  • 🎨 Форматирование: поддерживает условное форматирование, графики, макросы.
  • 📊 Память: использует потоковую запись, не грузит всё в RAM.
⚠️ Внимание: xlsxwriter может только создавать файлы, но не редактировать существующие. Для этого используйте openpyxl.

Убедитесь, что на диске достаточно места (1 млн строк ≈ 50-100 МБ)|Отключите автосохранение в Excel во время записи|Используйте xlsxwriter вместо openpyxl для файлов >50 000 строк|Проверьте кодировку данных (избегайте символов, ломающих Excel)

-->

5. Работа с форматами и стилями ячеек

Чтобы данные в Excel выглядели профессионально, настройте форматирование. Пример с openpyxl:

from openpyxl import Workbook

from openpyxl.styles import Font, Alignment, Border, Side

wb = Workbook()

ws = wb.active

Создаём стиль для заголовка

header_font = Font(bold=True, size=14, color="0066CC")

header_alignment = Alignment(horizontal='center')

thin_border = Border(left=Side(style='thin'),

right=Side(style='thin'),

top=Side(style='thin'),

bottom=Side(style='thin'))

Применяем стиль к ячейке

ws['A1'] = "Отчёт по продажам"

ws['A1'].font = header_font

ws['A1'].alignment = header_alignment

ws['A1'].border = thin_border

Сохраняем

wb.save("styled.xlsx")

Дополнительные возможности форматирования:

  • 🎨 Цвета: используйте HEX-коды (color="FF0000" для красного).
  • 📏 Выравнивание: horizontal='left', vertical='center'.
  • 🔢 Числовые форматы: number_format='#,##0.00' для двух знаков после запятой.
  • 📊 Условное форматирование: требует openpyxl или xlsxwriter.

Важно: Стили применяются после записи данных. Если вы сначала примените стиль, а потом запишете значение, форматирование сбросится.

6. Обработка ошибок и типичные проблемы

При записи в Excel часто возникают ошибки. Рассмотрим самые распространённые:

ОшибкаПричинаРешение
PermissionError: [Errno 13] Файл открыт в Excel или другой программе Закройте файл или используйте временное имя
InvalidFileException Повреждённый файл или неверный формат Проверьте расширение (.xlsx vs .xls)
Данные обрезаются после 255 символов Ограничение Excel на длину текста в ячейке Разбейте текст на несколько ячеек или используйте примечания
DataValidationError Некорректные данные (например, текст в числовом столбце) Проверьте типы данных с помощью pd.to_numeric()

Для отладки используйте блок try-except:

try:

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

except PermissionError:

print("Ошибка: закройте файл Excel перед записью!")

except Exception as e:

print(f"Неизвестная ошибка: {str(e)}")

Как проверить, открыт ли файл в Excel

Используйте модуль psutil для проверки процессов:

import psutil

def is_file_open(filepath):

for proc in psutil.process_iter(['name', 'open_files']):

try:

if filepath.lower() in [f.path.lower() for f in proc.open_files()]:

return True

except:

continue

return False

print(is_file_open("output.xlsx")) # True, если файл открыт

7. Продвинутые техники: формулы, графики, сводные таблицы

С помощью Python можно автоматизировать создание сложных элементов Excel:

  • 📈 Графики: xlsxwriter поддерживает 10+ типов диаграмм.
  • 🔄 Сводные таблицы: требуется openpyxl 3.0+.
  • 🔗 Гиперссылки: ws['A1'].hyperlink = "https://example.com".
  • 🔒 Защита листа: ws.protection.sheet = True.

Пример добавления графика через xlsxwriter:

import xlsxwriter

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

worksheet = workbook.add_worksheet()

Данные для графика

data = [10, 40, 50, 20, 10, 50, 30]

worksheet.write_column('A1', data)

Создаём график

chart = workbook.add_chart({'type': 'column'})

chart.add_series({'values': '=Sheet1!$A$1:$A$7'})

worksheet.insert_chart('C1', chart)

workbook.close()

Для создания сводной таблицы в openpyxl:

from openpyxl import Workbook

from openpyxl.worksheet.table import Table, TableStyleInfo

wb = Workbook()

ws = wb.active

Заполняем данные

ws.append(["Категория", "Продажи", "Регион"])

ws.append(["Электроника", 1500, "Москва"])

ws.append(["Одежда", 800, "СПб"])

ws.append(["Электроника", 2000, "Казань"])

Создаём сводную таблицу

tab = Table(displayName="Table1", ref="A1:C4")

style = TableStyleInfo(name="TableStyleMedium9", showRowStripes=True)

tab.tableStyleInfo = style

ws.add_table(tab)

wb.save("pivot.xlsx")

8. Автоматизация: запись в Excel по расписанию

Чтобы запись данных в Excel выполнялась автоматически (например, ежедневно), используйте:

  • 🕒 Планировщик Windows: schtasks для запуска скрипта.
  • 🐍 Библиотеку schedule: для запуска прямо из Python.
  • 🌐 Cloud-решения: AWS Lambda, Google Cloud Functions.

Пример с schedule:

import schedule

import time

import pandas as pd

def generate_report():

data = {"Time": [pd.Timestamp.now()], "Value": [42]}

df = pd.DataFrame(data)

df.to_excel(f"report_{pd.Timestamp.now().date()}.xlsx", index=False)

print("Отчёт сгенерирован!")

Запускаем каждый день в 18:00

schedule.every().day.at("18:00").do(generate_report)

while True:

schedule.run_pending()

time.sleep(60)

⚠️ Внимание: При автоматической записи проверяйте, не превышен ли лимит файлов в папке. Используйте ротацию (например, хранить только последние 30 отчётов).

FAQ: Частые вопросы по записи данных в Excel

Можно ли записать данные в Excel без установки библиотек?

Нет, Python не имеет встроенной поддержки формата Excel. Минимально требуется openpyxl или xlwt. Альтернатива — запись в CSV (pd.to_csv()), но это не Excel.

Как записать данные в существующий файл Excel, не стирая старые данные?

Используйте load_workbook() из openpyxl:

from openpyxl import load_workbook

wb = load_workbook("existing.xlsx")

ws = wb.active

ws.append([4, 5, 6]) # Добавляем новую строку

wb.save("existing.xlsx")

Почему при записи через pandas русские буквы отображаются как "???"?

Проблема в кодировке. Укажите encoding='utf-8' при чтении данных или используйте engine='xlsxwriter':

df.to_excel("output.xlsx", engine='xlsxwriter', index=False)
Как записать данные в Excel на удалённый сервер?

Сначала сохраните файл локально, затем загрузите по FTP/SSH:

import paramiko  # для SFTP

Сохраняем локально

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

Загружаем на сервер

ssh = paramiko.SSHClient()

ssh.connect("host", username="user", password="pass")

sftp = ssh.open_sftp()

sftp.put("temp.xlsx", "/remote/path/report.xlsx")

sftp.close()

Можно ли записать данные в Excel онлайн (Google Sheets)?

Да, используйте библиотеку gspread:

import gspread

from oauth2client.service_account import ServiceAccountCredentials

Аутентификация

scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]

creds = ServiceAccountCredentials.from_json_keyfile_name("credentials.json", scope)

client = gspread.authorize(creds)

Открываем таблицу и записываем данные

sheet = client.open("Мой документ").sheet1

sheet.append_row([1, 2, 3])

Потребуется создать проект в Google Cloud и скачать credentials.json.