2016-04-18 16 views
13

Ich spare Pandas DataFrame to_excel mit xlsxwriter. Ich habe es geschafft, alle meine Daten zu formatieren (Spaltenbreite, Schriftgröße usw. einstellen), außer dass ich die Schriftart des Headers ändere, und ich finde den Weg dazu nicht. Hier ist mein Beispiel:pandas xlsxwriter, format header

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

Die vorletzte Zeile, die versucht, Format für den Header festzulegen, tut nichts.

pd.core.format.header_style = None 

Alle zusammen:

Antwort

19

Ich glaube, Sie erste Reset-Standard-Header-Stil benötigen, dann können Sie es ändern

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

Sie erklären durch jmcnamara, danken:

In Excel Ein Zellenformat, das ein Zeilenformat überschreibt, überschreibt ein Spaltenformat. Das pd.core.format.header_style wird in ein Format konvertiert und auf jede Zelle in der Kopfzeile angewendet. Daher kann der Standardwert nicht durch set_row() überschrieben werden. Einstellung pd.core.format.header_style zu None bedeutet, dass die Header-Zellen kein benutzerdefiniertes Format haben und daher von set_row() überschrieben werden können.

EDIT: In der Version 0.18.1 Sie haben

pd.core.format.header_style = None 

zu ändern: krvkir

pd.formats.format.header_style = None 

Dank.

+3

Gute Problemumgehung. Nur ein kurzer Hintergrund, um zu erklären, warum das funktioniert. In Excel überschreibt ein Zellenformat, das ein Zeilenformat überschreibt, ein Spaltenformat. Das 'pd.core.format.header_style' wird in ein Format konvertiert und auf jede Zelle in der Kopfzeile angewendet. Daher kann der Standardwert nicht durch 'set_row()' überschrieben werden. Das Setzen von 'pd.core.format.header_style' auf' None' bedeutet, dass die Header-Zellen kein benutzerdefiniertes Format haben und somit das Format überschrieben werden kann. – jmcnamara

+4

Es sieht so aus als ob in Pandas 0.18.1 'pd. core.format' zu 'pd.formats' Modul, so sollte man jetzt' pd.formats.format.header_style = None' schreiben. – krvkir

+0

@krvkir - Danke, ich füge deinen Kommentar hinzu, um zu antworten. – jezrael

4

In Pandas 0.20 änderte sich die Lösung der angenommenen Antwort erneut.

pandas.io.formats.excel.header_style 
+0

Ich bekomme AttributeError: 'Modul' Objekt hat kein Attribut 'Excel' für pd.io.formats.excel.header_style = Keine. Pandas Version 0.20.1. – Devon

+1

Dieser Fehler wird von @Ironbeards Antwort unten korrigiert. – Devon

19

Ein Update für alle, die über dieses Thema kommt und nutzt Pandas 0.20.1:

Das Format, das auf keine festgelegt werden sollte, finden Sie unter.

Es scheint, der erforderliche Code ist jetzt

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

Anscheinend ist die excel Submodul nicht automatisch importiert, so einfach pandas.io.formats.excel.header_style = None allein versuchte, wird ein AttributeError zu erhöhen.