有没有办法用pandas.ExcelWriter自动调整Excel列的宽度?

我被要求生成一些Excel报告。 我目前对我的数据使用大量的pandas,所以自然我想使用pandas.ExcelWriter方法来生成这些报告。 但固定的列宽是一个问题。

我到目前为止的代码很简单。 假设我有一个名为“df”的数据框:

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

我正在查看pandas代码,我没有看到任何设置列宽的选项。 宇宙中是否有一个窍门可以使列自动适应数据? 还是有事情后,我可以做xlsx文件来调整列的宽度?

(我正在使用OpenPyXL库,并生成.xlsx文件 – 如果这有什么不同)。

谢谢。

现在可能没有自动的方法,但是当你使用openpyxl时,下面这一行(由用户Bufke 用手工方式进行的另一个回答改编)允许你指定一个合理的值(以字符宽度表示):

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

受上面user6178746的回答启发,我有以下几点:

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

有一个很好的包,我最近开始使用称为StyleFrame。

它获得DataFrame,让你很容易地devise风格…

默认情况下,列宽是自动调整的。

例如:

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

你也可以改变列的宽度:

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

我发布这个,因为我刚碰到相同的问题,发现Xlsxwriter和pandas的官方文档仍然有这个function列为不支持。 我一起砍了解决scheme,解决了我遇到的问题。 我基本上只是遍历每一列,并使用worksheet.set_column设置列的宽度==该列的内容的最大长度。

一个重要的说明,但是。 此解决scheme不适合列标题,只是列值。 这应该是一个简单的变化,但如果你需要适应头。 希望这可以帮助别人:)

 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'] #Find the number of columns to iterate through columns = len(my_dataframe.columns) column_series = pd.Series(range(columns)) column_list = column_series.tolist() #Iterate through each column and set the width == the max length in that column. for i in column_list: #find length of column i column_len = my_dataframe[[i]].astype(str).apply(lambda x: x.str.len()).max().max() #set the column length worksheet.set_column(i,i,column_len) writer.save() 

编辑

以下是关于列问题的更新。 如果列标题大于最大列值长度,则将使用列标题。 我还添加了一个2的缓冲区,给一点填充。

 #Iterate through each column and set the width == the max length in that column. for i in column_list: #filter for header header = my_dataframe[[i]].astype(str).columns.values #Get length of header header_len = len(header.max()) + 2 #Get length of column values column_len = my_dataframe[[i]].astype(str).apply(lambda x: x.str.len()).max().max() + 2 #Choose the greater of the column length or column value length if header_len >= column_len: worksheet.set_column(i,i,header_len) else: worksheet.set_column(i,i,column_len) writer.save()