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

При попытке сохранить DataFrame или список данных из Python в файл Excel (.xlsx или .csv) пользователи часто сталкиваются с ошибками кодировки, несовместимостью библиотек или потерянным форматированием. Проблема усугубляется, если требуется записать данные с сохранением формул, стилей ячеек или нескольких листов — стандартные методы вроде pandas.to_excel() здесь не всегда работают. Например, при использовании openpyxl без явного указания параметра engine возникает ValueError: No engine for filetype: 'xlsx', а в xlwt отсутствует поддержка формата .xlsx (только устаревший .xls).

Решение зависит от задачи: для простых таблиц подойдёт pandas с минимальным кодом, для сложного форматирования — openpyxl или XlsxWriter, а для работы с большими данными (>1 млн строк) оптимален .csv с последующим импортом в Excel. Ниже разобраны все актуальные способы записи, включая обработку ошибок и нюансы производительности.

1. Быстрая запись через pandas (для DataFrame)

Библиотека pandas предоставляет самый короткий путь для сохранения данных в Excel, если они уже структурированы в виде DataFrame. Метод to_excel() автоматически преобразует таблицу в формат .xlsx, но требует установки дополнительного движка (по умолчанию используется openpyxl или XlsxWriter).

Пример минимального кода для записи:

import pandas as pd

Создаём DataFrame

data = {'Имя': ['Алексей', 'Мария'], 'Возраст': [28, 34]}

df = pd.DataFrame(data)

Сохраняем в Excel

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

  • 📌 Плюсы: 1 строка кода, поддержка нескольких листов (ExcelWriter), автоматическое форматирование заголовков.
  • ⚠️ Минусы: Требует установки openpyxl (pip install openpyxl), не сохраняет цвет ячеек или условное форматирование.
  • Нюанс: Для записи на существующий лист используйте mode='a' и if_sheet_exists='replace'.

Если при выполнении возникает ошибка ModuleNotFoundError: No module named 'openpyxl', установите зависимость:

pip install pandas openpyxl

2. Полный контроль с openpyxl (для сложного форматирования)

Библиотека openpyxl позволяет управлять каждой ячейкой Excel: задавать шрифты, цвета, формулы, объединять ячейки и создавать диаграммы. Это единственный способ записать данные с сохранением условного форматирования или сводных таблиц прямо из Python.

Пример кода для записи данных с форматированием:

from openpyxl import Workbook

from openpyxl.styles import Font, Color, PatternFill

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

wb = Workbook()

ws = wb.active

ws.title = "Отчёт"

Данные для записи

data = [

["Продукт", "Цена", "Количество"],

["Ноутбук", 45000, 5],

["Смартфон", 32000, 12]

]

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

for row in data:

ws.append(row)

Применяем стили к заголовку

header_font = Font(bold=True, color="00FF0000")

header_fill = PatternFill(start_color="DDDDDD", fill_type="solid")

for cell in ws[1]:

cell.font = header_font

cell.fill = header_fill

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

wb.save("formatted_report.xlsx")

ЗадачаКодПримечание
Объединение ячеекws.merge_cells('A1:C1')Только для соседних ячеек
Добавление формулыws['D2'] = '=SUM(B2:C2)'Формулы обновляются при открытии в Excel
Установка ширины столбцаws.column_dimensions['A'].width = 20Ширина в символах
Создание диаграммыfrom openpyxl.chart import BarChartТребует указания диапазона данных

Установите библиотеку: pip install openpyxl|Проверьте версию: import openpyxl; print(openpyxl.__version__) (актуальная ≥3.0)|Используйте load_workbook() для редактирования существующих файлов|Сохраняйте файл с расширением .xlsx, а не .xls

-->

⚠️ Внимание: openpyxl не поддерживает формат .xls (старый Excel 97-2003). Для работы с ним используйте xlwt (см. раздел 4).

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

Если вам нужно записать более 100 тысяч строк, pandas или openpyxl будут работать медленно из-за высокого потребления памяти. Библиотека XlsxWriter оптимизирована для таких случаев: она записывает данные потоково, не храня весь файл в оперативной памяти.

Пример записи 1 млн строк с минимальным использованием RAM:

import xlsxwriter

Создаём файл

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

worksheet = workbook.add_worksheet()

Записываем данные порциями

for row in range(1, 1000001):

worksheet.write(row, 0, f'Данные {row}') # Столбец A

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

workbook.close()

  • Преимущества: Скорость записи ~100к строк/секунду, поддержка формул и базовых стилей.
  • 🔄 Ограничения: Не может редактировать существующие файлы (только создание новых).
  • 📊 Совет: Для ещё большей производительности используйте worksheet.write_string() вместо универсального write().

pandas|openpyxl|XlsxWriter|xlwt|Другую

-->

4. Работа с устаревшим форматом .xls (библиотека xlwt)

Формат .xls (Excel 97-2003) до сих пор используется в некоторых корпоративных системах. Для записи в него подходит библиотека xlwt, но она имеет ограничения: максимальное количество строк — 65536, нет поддержки .xlsx.

Пример кода для записи в .xls:

import xlwt

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

wb = xlwt.Workbook()

ws = wb.add_sheet('Лист1')

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

ws.write(0, 0, 'Продукт') # Строки и столбцы нумеруются с 0

ws.write(0, 1, 'Цена')

ws.write(1, 0, 'Ноутбук')

ws.write(1, 1, 45000)

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

wb.save('old_format.xls')

⚠️ Внимание: Библиотека xlwt не поддерживает формулы, сводные таблицы или современные функции Excel. Для конвертации .xls в .xlsx используйте pandas:
df = pd.read_excel('old_format.xls')

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

5. Альтернативный подход: запись в CSV с последующим импортом

Если задача — просто перенести данные из Python в Excel без форматирования, оптимальный способ — сохранить их в .csv, а затем открыть файл в Excel. Этот метод в 10-50 раз быстрее записи в .xlsx и не требует дополнительных библиотек.

Пример записи списка словарей в CSV:

import csv

data = [

{"Имя": "Алексей", "Возраст": 28},

{"Имя": "Мария", "Возраст": 34}

]

with open('data.csv', 'w', newline='', encoding='utf-8') as file:

writer = csv.DictWriter(file, fieldnames=data[0].keys())

writer.writeheader()

writer.writerows(data)

  • Плюсы: Нет зависимостей, максимальная скорость, поддержка любых данных.
  • Минусы: Нет поддержки нескольких листов, формул или форматирования.
  • 🔹 Нюанс: Для корректного отображения кириллицы всегда указывайте encoding='utf-8-sig'.
Как автоматизировать открытие CSV в Excel?

Используйте модуль os для запуска Excel после записи:

import os

os.system('start excel.exe data.csv') # Для Windows

Или для macOS:

os.system('open -a "Microsoft Excel" data.csv')

6. Обработка ошибок и оптимизация

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

ОшибкаПричинаРешение
PermissionError: [Errno 13]Файл открыт в ExcelЗакройте файл или используйте mode='a' в pd.ExcelWriter
ValueError: No engine for filetypeНе установлен openpyxl/XlsxWriterpip install openpyxl xlsxwriter
DataFrame is too largeСлишком много данных для .xlsxРазбейте на несколько файлов или используйте .csv
IllegalCharacterErrorСпецсимволы в данных (например, \n)Очистите данные: df.replace({'\n': ' '}, regex=True)

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

  1. Отключите автоформатирование: pd.set_option('display.float_format', '{:.2f}'.format).
  2. Используйте chunksize в pd.read_excel() для поточной обработки.
  3. Для openpyxl включите режим оптимизации: wb = Workbook(write_only=True).

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

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

Нет, Python не имеет встроенной поддержки форматов Excel. Минимальный набор — pandas + openpyxl (или XlsxWriter). Для .csv достаточно стандартной библиотеки csv.

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

Используйте pd.ExcelWriter с параметром mode='a' и if_sheet_exists:

with pd.ExcelWriter('file.xlsx', engine='openpyxl', mode='a') as writer:

df.to_excel(writer, sheet_name='НовыйЛист', if_sheet_exists='replace')

Почему в Excel вместо кириллицы отображаются кракозябры?

Проблема в кодировке. Для .csv укажите encoding='utf-8-sig'. Для .xlsx проверьте шрифты в настройках Excel (может потребоваться установить Arial Unicode MS).

Как записать данные в Excel с сохранением формул?

Только через openpyxl или XlsxWriter. Пример для openpyxl:

ws['A1'] = 10

ws['A2'] = 20

ws['A3'] = '=SUM(A1:A2)' # Формула записывается как строка

Какая библиотека самая быстрая для записи 1 млн строк?

XlsxWriter лидирует по скорости (~100к строк/сек), следом идёт .csv (~200к строк/сек). openpyxl и pandas в 5-10 раз медленнее.