2016-04-18 24 views
13

Zapisuję pandy DataFrame to_excel za pomocą xlsxwriter. Udało mi się sformatować wszystkie moje dane (ustawioną szerokość kolumny, rozmiar czcionki itp.) Z wyjątkiem zmiany czcionki nagłówka i nie mogę znaleźć sposobu, aby to zrobić. Oto mój przykład:pandy xlsxwriter, nagłówek formatu

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() 

Przedostatnia linia próbująca ustawić format dla nagłówka nic nie robi.

Odpowiedz

19

myślę, że trzeba najpierw resetowania domyślny styl nagłówka, a następnie można go zmienić:

pd.core.format.header_style = None 

Wszystko razem:

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() 

Wyjaśniając przez jmcnamara, dziękuję:

W programie Excel format komórki zastępuje format wiersza zastępuje format kolumny. pd.core.format.header_style jest konwertowany na format i jest stosowany do każdej komórki w nagłówku. W związku z tym wartość domyślna nie może zostać zmieniona przez set_row(). Ustawienie pd.core.format.header_style do None oznacza, że ​​komórki nagłówka nie mają formatu zdefiniowanego przez użytkownika i dlatego można je przesłonić przez set_row().

EDIT: W wersji 0.18.1 trzeba zmienić

pd.core.format.header_style = None 

do:

pd.formats.format.header_style = None 

dzięki krvkir.

+3

Dobre obejście. Po prostu jakieś wyjaśnienie, dlaczego to działa. W programie Excel format komórki zastępuje format wiersza zastępujący format kolumny. 'Pd.core.format.header_style' jest konwertowany do formatu i jest stosowany do każdej komórki w nagłówku. W związku z tym wartości domyślnej nie można przesłonić przez 'set_row()'. Ustawienie 'pd.core.format.header_style' na' Brak' oznacza, że ​​komórki nagłówka nie mają formatu zdefiniowanego przez użytkownika i dlatego format może być nadpisany .. – jmcnamara

+4

Wygląda na to, że w pandach 0.18.1 zostały przeniesione 'pd. core.format' do modułu 'pd.formats', więc teraz należy napisać' pd.formats.format.header_style = None'. – krvkir

+0

@krvkir - Dziękuję, dodaję komentarz do odpowiedzi. – jezrael

4

W pandach 0,20 rozwiązanie zaakceptowanej odpowiedzi zmieniło się ponownie.

Format które powinny być ustawione na None można znaleźć na stronie:

pandas.io.formats.excel.header_style 
+0

Otrzymuję AttributeError: obiekt 'module' nie ma atrybutu 'excel' dla pd.io.formats.excel.header_style = None. Wersja Pand w wersji 0.20.1. – Devon

+1

Ten błąd jest poprawiony przez odpowiedź @Ironbearda poniżej. – Devon

19

aktualizacji dla każdego, kto przychodzi po drugiej stronie tego postu i wykorzystuje Pandy 0.20.1.

Wydaje wymagany kod jest teraz

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

Widocznie excel modułem nie jest importowany automatycznie, więc po prostu próbuje pandas.io.formats.excel.header_style = None sam zgłosi AttributeError.