是否可以使用pandas.ExcelWriter自动调整Excel列宽?

2024-06-06 17:24:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

到目前为止我掌握的代码已经足够简单了。假设我有一个名为“df”的数据帧:

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

我查看了pandas代码,没有看到任何设置列宽的选项。宇宙中有没有一个诀窍可以让列自动调整到数据上?或者有什么我可以在事后对xlsx文件调整列宽?

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

谢谢你。


Tags: 文件数据方法代码pandasdf报表报告
3条回答

我发布这篇文章是因为我遇到了同一个问题,发现Xlsxwriter和pandas的官方文档仍然将此功能列为不受支持。我想出了一个解决办法,解决了我的问题。我基本上只是遍历每一列并使用worksheet.set_column设置列宽==该列内容的最大长度。

不过,有一点很重要。此解决方案不适合列标题,只适合列值。不过,如果您需要调整标题,那么这应该是一个简单的更改。希望这对某人有帮助:)

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

受到user6178746's answer的启发,我有以下几点:

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

现在可能没有自动的方法,但是当您使用openpyxl时,下面一行(改编自用户Bufkehow to do in manually的另一个回答)允许您指定一个sane值(字符宽度):

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

相关问题 更多 >