[python] Pandas.ExcelWriter로 Excel 열 너비를 자동 조정하는 방법이 있습니까?

일부 Excel 보고서를 생성하라는 요청을 받았습니다. 현재 데이터에 pandas를 상당히 많이 사용하고 있으므로 당연히 pandas.ExcelWriter 메서드를 사용하여 이러한 보고서를 생성하고 싶습니다. 그러나 고정 된 열 너비가 문제입니다.

지금까지 가지고있는 코드는 충분히 간단합니다. ‘df’라는 데이터 프레임이 있다고 가정합니다.

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

팬더 코드를 살펴 보았는데 열 너비를 설정하는 옵션이 실제로 보이지 않습니다. 열이 데이터에 맞게 자동 조정되도록 만드는 트릭이 유니버스에 있습니까? 아니면 xlsx 파일에서 열 너비를 조정하기 위해 할 수있는 일이 있습니까?

(저는 OpenPyXL 라이브러리를 사용하고 있으며 .xlsx 파일을 생성하고 있습니다-차이가 있다면.)

감사합니다.



답변

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


답변

방금 동일한 문제가 발생하여 Xlsxwriter 및 pandas에 대한 공식 문서에이 기능이 아직 지원되지 않는 것으로 나열되어 있음을 발견했기 때문에 이것을 게시하고 있습니다. 나는 내가 가진 문제를 해결하는 솔루션을 함께 해킹했습니다. 기본적으로 각 열을 반복하고 workstation.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()


답변

지금 당장 자동으로 수행하는 방법은 없지만 openpyxl을 사용하면 다음 줄 ( 수동으로 수행하는 방법대한 사용자 Bufke의 다른 답변에서 수정 됨 )을 사용하여 정상적인 값 (문자 너비)을 지정할 수 있습니다.

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


답변

최근에 사용하기 시작한 StyleFrame이라는 멋진 패키지가 있습니다.

그것은 DataFrame을 얻고 매우 쉽게 스타일을 지정할 수 있습니다 …

기본적으로 열 너비는 자동 조정됩니다.

예를 들면 :

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)

업데이트 1

버전 1.4에서 best_fit인수가 StyleFrame.to_excel. 설명서를 참조하십시오 .

업데이트 2

다음은 StyleFrame 3.xx에서 작동하는 코드 샘플입니다.

from styleframe import StyleFrame
import pandas as pd

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


답변

pandas와 xlsxwriter를 사용하면 작업을 수행 할 수 있습니다. 아래 코드는 Python 3.x에서 완벽하게 작동합니다. pandas로 XlsxWriter를 사용하는 방법에 대한 자세한 내용은이 링크가 유용 할 수 있습니다. https://xlsxwriter.readthedocs.io/working_with_pandas.html

import pandas as pd
writer = pd.ExcelWriter(excel_file_path, engine='xlsxwriter')
df.to_excel(writer, sheet_name="Summary")
workbook = writer.book
worksheet = writer.sheets["Summary"]
#set the column width as per your requirement
worksheet.set_column('A:A', 25)
writer.save()


답변

모든 열 길이를 동적으로 조정

writer = pd.ExcelWriter('/path/to/output/file.xlsx')
df.to_excel(writer, sheet_name='sheetName', index=False, na_rep='NaN')

for column in df:
    column_length = max(df[column].astype(str).map(len).max(), len(column))
    col_idx = df.columns.get_loc(column)
    writer.sheets['sheetName'].set_column(col_idx, col_idx, column_length)

열 이름을 사용하여 수동으로 열 조정

col_idx = df.columns.get_loc('columnName')
writer.sheets['sheetName'].set_column(col_idx, col_idx, 15)

열 인덱스를 사용하여 수동으로 열 조정

writer.sheets['sheetName'].set_column(col_idx, col_idx, 15)

위 중 하나라도 실패한 경우

AttributeError: 'Worksheet' object has no attribute 'set_column'

다음을 설치하십시오 xlsxwriter.

pip install xlsxwriter


답변

열 내용보다는 열 머리글을 기준으로 열을 조정하는 것이 더 유용하다는 것을 알았습니다.

사용 df.columns.values.tolist() 하여 열 머리글 목록을 생성하고 이러한 머리글의 길이를 사용하여 열 너비를 결정합니다.

아래 전체 코드를 참조하십시오.

import pandas as pd
import xlsxwriter

writer = pd.ExcelWriter(filename, engine='xlsxwriter')
df.to_excel(writer, index=False, sheet_name=sheetname)

workbook = writer.book # Access the workbook
worksheet= writer.sheets[sheetname] # Access the Worksheet

header_list = df.columns.values.tolist() # Generate list of headers
for i in range(0, len(header_list)):
    worksheet.set_column(i, i, len(header_list[i])) # Set column widths based on len(header)

writer.save() # Save the excel file