web-dev-qa-db-fra.com

pandas xlsxwriter, en-tête de format

J'économise pandas DataFrame to_Excel en utilisant xlsxwriter. J'ai réussi à formater toutes mes données (définir la largeur de colonne, la taille de police, etc.) sauf pour changer la police de l'en-tête et je ne trouve pas le façon de le faire. Voici mon exemple:

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

L'avant-dernière ligne qui tente de définir le format de l'en-tête ne fait rien.

21
Egor Ignatenkov

Je pense que vous devez d'abord réinitialiser le style d'en-tête par défaut, puis vous pouvez le changer:

pd.core.format.header_style = None

Tous ensemble:

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

Expliquant par jmcnamara , merci:

Dans Excel, un format de cellule remplace un format de ligne remplace un format de colonne. pd.core.format.header_style Est converti en un format et appliqué à chaque cellule de l'en-tête. En tant que tel, la valeur par défaut ne peut pas être remplacée par set_row(). La définition de pd.core.format.header_style Sur None signifie que les cellules d'en-tête n'ont pas de format défini par l'utilisateur et peuvent donc être remplacées par set_row().

EDIT: Dans la version 0.18.1, Vous devez changer

pd.core.format.header_style = None

à:

pd.formats.format.header_style = None

EDIT: à partir de la version 0.20 cela a encore changé

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

merci krvkir .

30
jezrael

Une mise à jour pour quiconque tombe sur ce post et utilise Pandas 0.20.1.

Il semble que le code requis soit maintenant

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

Apparemment, le sous-module Excel n'est pas importé automatiquement, alors essayez simplement pandas.io.formats.Excel.header_style = None seul lèvera un AttributeError.

24
Ironbeard

Dans pandas 0,20, la solution de la réponse acceptée a encore changé.

Le format qui doit être défini sur Aucun se trouve à l'adresse suivante:

pandas.io.formats.Excel.header_style
4
Alec Hanefeld

pour pandas 0,24:

Ce qui suit ne fonctionne plus:

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

Utilisez plutôt le pseudo-code suivant pour être en contrôle de soi et à l'épreuve du temps:

# [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)
3
eliu