python workbook Existe-t-il un moyen d'ajuster automatiquement les largeurs de colonnes Excel avec pandas.ExcelWriter?



python openpyxl write formula (4)

On me demande de générer des rapports Excel. J'utilise actuellement des pandas assez lourdement pour mes données, alors je voudrais naturellement utiliser la méthode pandas.ExcelWriter pour générer ces rapports. Cependant, les largeurs de colonne fixes posent problème.

Le code que j'ai à ce jour est assez simple. Disons que j'ai un dataframe appelé «df»:

writer = pd.ExcelWriter(excel_file_path)
df.to_excel(writer, sheet_name="Summary")

Je regardais le code des pandas, et je ne vois aucune option pour définir la largeur des colonnes. Existe-t-il un truc dans l'univers pour que les colonnes s'ajustent automatiquement aux données? Ou est-ce que je peux faire quelque chose après coup dans le fichier xlsx pour ajuster la largeur des colonnes?

(J'utilise la bibliothèque OpenPyXL et génère des fichiers .xlsx - si cela fait une différence.)

Je vous remercie.


Il n'y a probablement pas de moyen automatique de le faire maintenant, mais comme vous utilisez openpyxl, la ligne suivante (adaptée d'une autre réponse de l'utilisateur Bufke sur la façon de procéder manuellement ) vous permet de spécifier une valeur saine (en caractères):

writer.sheets['Summary'].column_dimensions['A'].width = 15

Inspiré par la réponse de user6178746 ci-dessus, j'ai les éléments suivants:

# Given a dict of dataframes, for example:
# dfs = {'gadgets': df_gadgets, 'widgets': df_widgets}

writer = pd.ExcelWriter(filename, engine='xlsxwriter')
for sheetname, df in dfs.items():  # loop through `dict` of dataframes
    df.to_excel(writer, sheet_name=sheetname)  # send df to writer
    worksheet = writer.sheets[sheetname]  # pull worksheet object
    for idx, col in enumerate(df):  # loop through all columns
        series = df[col]
        max_len = max((
            series.astype(str).map(len).max(),  # len of largest item
            len(str(series.name))  # len of column name/header
            )) + 1  # adding a little extra space
        worksheet.set_column(idx, idx, max_len)  # set column width
writer.save()

Je poste ceci parce que je viens de rencontrer le même problème et que la documentation officielle de Xlsxwriter et des pandas contient toujours cette fonctionnalité non prise en charge. J'ai piraté ensemble une solution qui résolvait le problème que je rencontrais. Je ne fais que parcourir chaque colonne et utiliser 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, mais 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 :)

import pandas as pd
import sqlalchemy as sa
import urllib


read_server = 'serverName'
read_database = 'databaseName'

read_params = urllib.quote_plus("DRIVER={SQL Server};SERVER="+read_server+";DATABASE="+read_database+";TRUSTED_CONNECTION=Yes")
read_engine = sa.create_engine("mssql+pyodbc:///?odbc_connect=%s" % read_params)

#Output some SQL Server data into a dataframe
my_sql_query = """ SELECT * FROM dbo.my_table """
my_dataframe = pd.read_sql_query(my_sql_query,con=read_engine)

#Set destination directory to save excel.
xlsFilepath = r'H:\my_project' + "\\" + 'my_file_name.xlsx'
writer = pd.ExcelWriter(xlsFilepath, engine='xlsxwriter')

#Write excel to file using pandas to_excel
my_dataframe.to_excel(writer, startrow = 1, sheet_name='Sheet1', index=False)

#Indicate workbook and worksheet for formatting
workbook = writer.book
worksheet = writer.sheets['Sheet1']

#Iterate through each column and set the width == the max length in that column. A padding length of 2 is also added.
for i, col in enumerate(my_dataframe.columns):
    # find length of column i
    column_len = my_dataframe[col].astype(str).str.len().max()
    # Setting the length if the column header is larger
    # than the max column value length
    column_len = max(column_len, len(col)) + 2
    # set the column length
    worksheet.set_column(i, i, column_len)
writer.save()

Il y a un beau paquet que j'ai commencé à utiliser récemment appelé StyleFrame.

il obtient DataFrame et vous permet de le styler très facilement ...

par défaut, la largeur des colonnes est ajustée automatiquement.

par exemple:

from StyleFrame import StyleFrame
import pandas as pd

df = pd.DataFrame({'aaaaaaaaaaa': [1, 2, 3], 'bbbbbbbbb': [1, 1, 1], 'ccccccccccc': [2, 3, 4]})
excel_writer = StyleFrame.ExcelWriter('example.xlsx')
sf = StyleFrame(df)
sf.to_excel(excel_writer=excel_writer, row_to_add_filters=0, columns_and_rows_to_freeze='B2')
excel_writer.save()

vous pouvez également modifier la largeur des colonnes:

sf.set_column_width(columns=['aaaaaaaaaaa', 'bbbbbbbbb'], width=35.3)




openpyxl