Подтвердить что ты не робот

Pandas xlsxwriter, заголовок форматирования

Я сохраняю pandas DataFrame to_excel с помощью xlsxwriter. Мне удалось отформатировать все мои данные (установить ширину столбца, размер шрифта и т.д.), Кроме изменения шрифта заголовка, и я не могу найти способ сделать это. Вот мой пример:

import pandas as pd
data = pd.DataFrame({'test_data': [1,2,3,4,5]})
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

data.to_excel(writer, sheet_name='test', index=False)

workbook  = writer.book
worksheet = writer.sheets['test']

font_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10})
header_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10, 'bold': True})

worksheet.set_column('A:A', None, font_fmt)
worksheet.set_row(0, None, header_fmt)

writer.save()

Предпоследняя строка, которая пытается установить формат для заголовка, ничего не делает.

4b9b3361

Ответ 1

Я думаю, что вам нужно сначала сбросить стиль заголовка по умолчанию, а затем вы можете изменить его:

pd.core.format.header_style = None

Все вместе:

import pandas as pd

data = pd.DataFrame({'test_data': [1,2,3,4,5]})
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

pd.core.format.header_style = None

data.to_excel(writer, sheet_name='test', index=False)

workbook  = writer.book
worksheet = writer.sheets['test']

font_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10})
header_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10, 'bold': True})

worksheet.set_column('A:A', None, font_fmt)
worksheet.set_row(0, None, header_fmt)

writer.save()

Объясняю jmcnamara, спасибо:

В Excel формат ячейки переопределяет формат строки, переопределяет формат столбца. pd.core.format.header_style преобразуется в формат и применяется к каждой ячейке в заголовке. Таким образом, значение по умолчанию не может быть переопределено с помощью set_row(). Установка для pd.core.format.header_style None означает, что ячейки заголовка не имеют определенного пользователем формата, и, таким образом, его можно переопределить с помощью set_row().

РЕДАКТИРОВАТЬ: В версии 0.18.1 вы должны изменить

pd.core.format.header_style = None

чтобы:

pd.formats.format.header_style = None

РЕДАКТИРОВАТЬ: с версии 0.20 это изменилось снова

import pandas.io.formats.excel
pandas.io.formats.excel.header_style = None

спасибо крвкир.

Ответ 2

Обновление для всех, кто сталкивается с этим сообщением и использует Pandas 0.20.1.

Кажется, что требуемый код теперь

import pandas.io.formats.excel
pandas.io.formats.excel.header_style = None

По-видимому, подмодуль excel не импортируется автоматически, поэтому просто попробуйте только pandas.io.formats.excel.header_style = None поднять AttributeError.

Ответ 3

В pandas 0,20 решение принятого ответа снова изменилось.

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

pandas.io.formats.excel.header_style

Ответ 4

для панд 0,24:

Ниже не работает больше:

import pandas.io.formats.excel
pandas.io.formats.excel.header_style = None

Вместо этого используйте следующий псевдокод для самоконтроля и проверки на будущее:

# [1] write df to excel as usual
writer = pd.ExcelWriter(path_output, engine='xlsxwriter')
df.to_excel(writer, sheet_name, index=False)

# [2] do formats for other rows and columns first

# [3] create a format object for the header: headercellformat

# [4] write to the header row **one cell at a time**, with columnname and format
for columnnum, columnname in enumerate(list(df.columns)):
    worksheet.write(0, columnnum, columnname, headercellformat)

Ответ 5

Еще один вариант для Панды 0,25 (вероятно, также 0,24). Вероятно, не самый лучший способ сделать это, но это сработало для меня.

import pandas.io.formats.excel
pandas.io.formats.excel.ExcelFormatter.header_style = None

Ответ 6

Если вы не хотите полностью устанавливать стиль заголовка для панд, вы также можете передать header=False в ExcelWriter:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(3, 5), 
                  columns=pd.date_range('2019-01-01', periods=5, freq='M'))

file_path='output.xlsx'
writer = pd.ExcelWriter(file_path, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', header=False, index=False )
workbook = writer.book
fmt = workbook.add_format({'num_format': 'mm/yyyy', 'bold': True})
worksheet = writer.sheets['Sheet1']
worksheet.set_row(0, None, fmt)
writer.save()