write with open libreria create python excel pandas openpyxl

python - with - ¿Hay alguna forma de ajustar automáticamente el ancho de las columnas de Excel con pandas.ExcelWriter?



write excel with python (4)

Me están pidiendo que genere algunos informes de Excel. Actualmente estoy usando pandas bastante para mis datos, así que, naturalmente, me gustaría usar el método pandas.ExcelWriter para generar estos informes. Sin embargo, los anchos de columna fijos son un problema.

El código que tengo hasta ahora es bastante simple. Digamos que tengo un dataframe llamado ''df'':

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

Estuve revisando el código de los pandas, y realmente no veo ninguna opción para establecer el ancho de las columnas. ¿Hay algún truco en el universo para que las columnas se ajusten automáticamente a los datos? ¿O hay algo que pueda hacer después del hecho en el archivo xlsx para ajustar el ancho de las columnas?

(Estoy usando la biblioteca OpenPyXL y generando archivos .xlsx, si eso hace la diferencia).

Gracias.


Estoy publicando esto porque me encontré con el mismo problema y descubrí que la documentación oficial para Xlsxwriter y pandas todavía tiene esta funcionalidad listada como no compatible. Arreglé una solución que resolvió el problema que estaba teniendo. Básicamente, simplemente recorro cada columna y uso la hoja de cálculo.set_column para establecer el ancho de la columna == la longitud máxima de los contenidos de esa columna.

Una nota importante, sin embargo. Esta solución no se ajusta a los encabezados de columna, simplemente a los valores de columna. Sin embargo, eso debería ser un cambio sencillo si necesitas colocar los encabezados. Espero que esto ayude a alguien :)

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


Hay un buen paquete que comencé a usar recientemente llamado StyleFrame.

recibe DataFrame y te permite diseñarlo muy fácilmente ...

de forma predeterminada, el ancho de las columnas se ajusta automáticamente.

por ejemplo:

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

también puedes cambiar el ancho de las columnas:

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


Inspirado por la respuesta anterior del usuario6178746, tengo lo siguiente:

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


Probablemente no haya una manera automática de hacerlo ahora, pero cuando usa openpyxl, la siguiente línea (adaptada de otra respuesta del usuario Bufke sobre cómo hacerlo manualmente ) le permite especificar un valor razonable (en anchos de caracteres):

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