On me demande de générer des rapports Excel. J'utilise actuellement assez massivement des pandas pour mes données, alors j'aimerais naturellement utiliser la méthode pandas.ExcelWriter pour générer ces rapports. Cependant, les largeurs de colonne fixes posent un problème.
Le code que j'ai jusqu'à présent est assez simple. Disons que j'ai un dataframe appelé 'df':
writer = pd.ExcelWriter(excel_file_path, engine='openpyxl')
df.to_excel(writer, sheet_name="Summary")
Je regardais le code pandas, et je ne vois vraiment aucune option pour définir la largeur des colonnes. Existe-t-il une astuce dans l'univers pour faire en sorte que les colonnes s'adaptent automatiquement aux données? Ou puis-je faire quelque chose après coup dans le fichier xlsx pour ajuster les largeurs de colonne?
(J'utilise la bibliothèque OpenPyXL et génère des fichiers .xlsx - si cela fait une différence.)
Je vous remercie.
to_excel
, peut-êtrecol_style=dict
qui contient des éléments de style d'en-tête col (plutôt que la valeur par défautheader_style
qui semble être codée en dur maintenantRéponses:
Inspiré par la réponse de user6178746 , j'ai ce qui suit:
la source
worksheet.set_column(idx+nlevels, idx+nlevels, max_len)
. Sinon, la longueur est calculée pour la première colonne du cadre, puis appliquée à la première colonne dans Excel, qui est probablement l'index.enumerate(df)
devrait êtreenumerate(df.columns)
puisque vous parcourez chaque colonne dansdf
.dict
itère réellement sur les clés dans ledict
(vous n'avez pas à dire manuellementdict.keys()
), l'itération sur apd.DataFrame
itère sur les colonnes. Vous n'avez pas à parcourir manuellementdf.columns
.Je publie ceci parce que je viens de rencontrer le même problème et que j'ai constaté que la documentation officielle de Xlsxwriter et des pandas contient toujours cette fonctionnalité répertoriée comme non prise en charge. J'ai piraté ensemble une solution qui a résolu le problème que j'avais. En gros, je parcoure chaque colonne et j'utilise worksheet.set_column pour définir la largeur de la colonne == la longueur maximale du contenu de cette colonne.
Une note importante, cependant. Cette solution ne correspond pas aux en-têtes de colonne, simplement aux valeurs de colonne. Cela devrait être un changement facile si vous avez besoin d'ajuster les en-têtes à la place. J'espère que cela aide quelqu'un :)
la source
()
fonction max à l'intérieur: `max (column_len (), len (col)) + 2`Il n'y a probablement pas de moyen automatique de le faire pour le moment, mais comme vous utilisez openpyxl, la ligne suivante (adaptée d'une autre réponse de l'utilisateur Bufke sur la façon de faire manuellement ) vous permet de spécifier une valeur saine (en largeurs de caractères):
la source
column_dimensions
attribut. Si vous souhaitez continuer à utiliser openpyxl, spécifiez-le simplement lors de la création de l'écrivain en utilisantpd.ExcelWriter(excel_filename, engine='openpyxl')
Xlsxwriter
comme moteur pour voir comment spécifier la largeur de colonne avec le moteur par défaut d'aujourd'hui.Il y a un joli package que j'ai commencé à utiliser récemment appelé StyleFrame.
il obtient DataFrame et vous permet de le styliser très facilement ...
par défaut, la largeur des colonnes s'ajuste automatiquement.
par exemple:
vous pouvez également modifier la largeur des colonnes:
METTRE À JOUR
Dans la version 1.4, l'
best_fit
argument a été ajouté àStyleFrame.to_excel
. Consultez la documentation .la source
best_fit
paramètre. De plus, lorsque j'ai essayé cela, j'ai obtenu de très mauvais résultats .index
paramètre mais pas de dés.sf.apply_headers_style(Styler(bold=False))
il m'a fallu beaucoup de temps pour comprendre cela. Et dans la déclaration d'importation,from StyleFrame import StyleFrame, Styler
. voici toutes les options en dehors du gras: styleframe.readthedocs.io/en/2.0.5/…En utilisant pandas et xlsxwriter, vous pouvez faire votre tâche, le code ci-dessous fonctionnera parfaitement dans Python 3.x. Pour plus de détails sur l'utilisation de XlsxWriter avec les pandas, ce lien peut être utile https://xlsxwriter.readthedocs.io/working_with_pandas.html
la source
J'ai trouvé qu'il était plus utile d'ajuster la colonne en fonction de l'en-tête de colonne plutôt que du contenu de la colonne.
En utilisant
df.columns.values.tolist()
je génère une liste des en-têtes de colonne et utilise les longueurs de ces en-têtes pour déterminer la largeur des colonnes.Voir le code complet ci-dessous:
la source
Au travail, j'écris toujours les dataframes dans des fichiers Excel. Donc, au lieu d'écrire le même code encore et encore, j'ai créé un module. Maintenant, je viens de l'importer et de l'utiliser pour écrire et formater les fichiers Excel. Il y a cependant un inconvénient, cela prend beaucoup de temps si la trame de données est très grande. Voici donc le code:
la source
Ajuster dynamiquement toutes les longueurs de colonne
Ajuster manuellement une colonne à l'aide du nom de la colonne
Ajuster manuellement une colonne à l'aide de l'index de colonne
Au cas où l'un des éléments ci-dessus échouerait avec
assurez-vous d'installer
xlsxwriter
:la source
Combinaison des autres réponses et commentaires et prise en charge des multi-indices:
la source
la source
La solution la plus simple consiste à spécifier la largeur de la colonne dans la méthode set_column.
la source
la source