Сообщить об ошибке.

Метод DataFrame.to_excel() модуля pandas в Python

Запись объекта DataFrame в рабочий лист Excel

Синтаксис:

df = DataFrame.to_excel(excel_writer, *, sheet_name='Sheet1', na_rep='', 
                        float_format=None, columns=None, header=True, index=True, 
                        index_label=None, startrow=0, startcol=0, engine=None, 
                        merge_cells=True, inf_rep='inf', freeze_panes=None, 
                        storage_options=None, engine_kwargs=None)

Параметры:

  • excel_writer - путь к файлу или существующий pandas.ExcelWriter.
  • sheet_name='Sheet1' - имя листа, который будет содержать таблица Excel.
  • na_rep='' - чем заполнять пропущенные значения (NaN) в данных.
  • float_format=None - строка формата для чисел с плавающей запятой. Например, float_format='%.2f'.
  • columns=None - список столбцов для записи в таблицу Excel
  • header=True - записывать или нет имена столбцов. Если задан список строк, то предполагается, что это псевдонимы для имен столбцов в DataFrame.
  • index=True - записывать или нет индексные метки строк (индекс).
  • index_label=None - метка столбца для индексных столбцов, если требуется. Если не указано, а header и index имеют значение True, то используются имена индексов. Если DataFrame использует MultiIndex, то нужно передать список меток.
  • startrow=0 - верхняя левая строка ячейки для сохранения в Excel.
  • startcol=0 - верхний левый столбец ячейки для сохранения в Excel.
  • engine=None - какой движок использовать - openpyxl или xlsxwriter. Также можно установить помощью options.io.excel.xlsx.writer или options.io.excel.xlsm.writer.
  • merge_cells=True - записывает MultiIndex и иерархические строки как объединенные ячейки.
  • inf_rep='inf' - как представить бесконечность (в Excel нет собственного представления бесконечности).
  • freeze_panes=None - кортеж из двух целых чисел, представляющих самую нижнюю строку и самый правый столбец для заморозки (при прокрутке). Каждый из этих параметров основан на единице, поэтому (1, 1) заморозит первую строку и первый столбец (по умолчанию None).
  • storage_options=None -
  • engine_kwargs=None - произвольные аргументы, передаются в движок, записывающий Excel файл.

Описание метода DataFrame.to_excel():

Метод DataFrame.to_excel() модуля pandas записывает объект DataFrame в рабочий лист Excel.

Чтобы записать один объект в файл Excel .xlsx, необходимо только указать имя целевого файла. Для записи нескольких листов необходимо создать объект pandas.ExcelWriter с именем целевого файла и указать лист в файле для записи.

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

Для совместимости с DataFrame.to_csv() DataFrame.to_excel() сериализует списки и преобразует их в строки перед записью. После сохранения книги невозможно записать дальнейшие данные без перезаписи всей книги.

Запись файлов Excel на диск

Чтобы записать объект DataFrame на лист файла Excel, можно использовать метод экземпляра DataFrame.to_excel(). Аргументы во многом такие же, как и DataFrame.to_csv(), описанные выше: первый аргумент - это имя файла Excel, а необязательный второй аргумент - имя листа, в который должен быть записан DataFrame. Например:

df.to_excel("path_to_file.xlsx", sheet_name="Sheet1")

Файлы с расширением .xlsx будут записаны с использованием модуля xlsxwriter (если доступно) или openpyxl.

DataFrame будет написан таким образом, чтобы имитировать выходные данные REPL. Метка index_label будет помещена во вторую строку вместо первой. Можно поместить её в первую строку, установив для аргумента merge_cells=False:

df.to_excel("path_to_file.xlsx", index_label="label", merge_cells=False)

Чтобы записать отдельные DataFrames на отдельные листы в одном файле Excel, можно передать экземпляр класса pandas.ExcelWriter.

with pd.ExcelWriter("path_to_file.xlsx") as writer:
    df1.to_excel(writer, sheet_name="Sheet1")
    df2.to_excel(writer, sheet_name="Sheet2")

Механизмы записи в Excel

При использовании аргумента engine_kwargs метод DataFrame.to_excel() передаст эти аргументы движку. Для этого важно знать, какие функции pandas использует внутри.

  • Механизм openpyxl записывает в файлы .xlsx и .xlsm. Для создания нового листа использует openpyxl.Workbook() и openpyxl.load_workbook() для добавления данных к существующему листу.
  • Что касается движка xlsxwriter, то он записывает файлы .xlsx и использует свой класс xlsxwriter.Workbook().
  • Для записи в файлы .ods используется модуль odf и собственный класс odf.opendocument.OpenDocumentSpreadsheet().

Библиотека pandas выбирает средство записи Excel двумя способами:

  • ключевой аргумент engine
  • расширение имени файла (по умолчанию, указанное в pandas.options)

Чтобы указать, какой модуль записи необходимо использовать, можно передать ключевой аргумент engine в DataFrame.to_excel() и pandas.ExcelWriter. Встроенные движки:

  • openpyxl: требуется версия 2.4 или выше.
  • xlsxwriter.
# Установив `engine` в методе `DataFrame.to_excel()`.
df.to_excel("path_to_file.xlsx", sheet_name="Sheet1", engine="xlsxwriter")

# Установив `engine` в конструкторе `ExcelWriter()`.
writer = pd.ExcelWriter("path_to_file.xlsx", engine="xlsxwriter")

Или через конфигурацию pandas.

from pandas import options

options.io.excel.xlsx.writer = "xlsxwriter"
df.to_excel("path_to_file.xlsx", sheet_name="Sheet1")

Запись файлов Excel в память

Библиотека pandas поддерживает запись файлов Excel в буфероподобные объекты, такие как io.StringIO или io.BytesIO, с помощью pandas.ExcelWriter().

from io import BytesIO

bio = BytesIO()

# в конструкторе `ExcelWriter` определяем "движок".
writer = pd.ExcelWriter(bio, engine="xlsxwriter")
df.to_excel(writer, sheet_name="Sheet1")

# Сохраняем книгу
writer.save()

# читаем, чтобы скопировать книгу в переменную в памяти.
bio.seek(0)
workbook = bio.read()

Примечание. Установка аргумента engine не является обязательным, но рекомендуется. Настройка механизма определяет версию создаваемой книги. Если задать engine='xlrd', то будет создана книга формата Excel 2003 (xls). Использование openpyxl или xlsxwriter создаст книгу в формате Excel 2007 xlsx. Если этот аргумент опущен, то создается книга в формате Excel 2007.

Стиль и форматирование DataFrame в Excel

Внешний вид листов Excel, созданных с помощью pandas, можно изменить, используя следующие аргументы в методе DataFrame.to_excel().

  • float_format : формат строки для чисел с плавающей запятой (по умолчанию отсутствует).
  • freeze_panes : кортеж из двух целых чисел, представляющих самую нижнюю строку и самый правый столбец для заморозки (при прокрутке). Каждый из этих параметров основан на единице, поэтому (1, 1) заморозит первую строку и первый столбец (по умолчанию None).

Использование движка xlsxwriter предоставляет множество опций для управления форматом листа Excel, созданного с помощью метода DataFrame.to_excel(). Дополнительные ключевые аргументы для модуля xlsxwriter можно передать через engine_kwargs.

В документации по модулю можно найти отличные примеры: https://xlsxwriter.readthedocs.io/working_with_pandas.html

Таблицы OpenDocument

Методы io для файлов Excel также поддерживают чтение и запись электронных таблиц OpenDocument с использованием модуля odfpy. Семантика и функции чтения и записи электронных таблиц OpenDocument соответствуют тому, что можно сделать для файлов Excel, используя engine='odf'. В случае использования необходима дополнительная установка зависимости pip install odfpy.

Функция read_excel() может читать электронные таблицы OpenDocument.

# Возвращает DataFrame
pandas.read_excel("path_to_file.ods", engine="odf")

Точно так же метод DataFrame.to_excel() может писать электронные таблицы OpenDocument.

# Записывает `DataFrame` в файл `.ods`
DataFrame.to_excel("path_to_file.ods", engine="odf")

Примеры использования DataFrame.to_excel()

Создаем и сохраняем книгу Excel:

>>> import pandas as pd
>>> df1 = pd.DataFrame([['a', 'b'], ['c', 'd']],
...                    index=['row 1', 'row 2'],
...                    columns=['col 1', 'col 2'])
>>> df1.to_excel("output.xlsx")

C указанием имя листа:

>>> df1.to_excel("output.xlsx", sheet_name='Sheet_name_1')

Если необходимо записать более чем один лист книги, необходимо указать объект ExcelWriter:

>>> df2 = df1.copy()
>>> with pd.ExcelWriter('output.xlsx') as writer:  
...     df1.to_excel(writer, sheet_name='Sheet_name_1')
...     df2.to_excel(writer, sheet_name='Sheet_name_2')

Класс ExcelWriter также можно использовать для добавления к существующему файлу Excel:

>>> with pd.ExcelWriter('output.xlsx', mode='a') as writer:  
...     df1.to_excel(writer, sheet_name='Sheet_name_3')

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

>>> df1.to_excel('output1.xlsx', engine='xlsxwriter')