복붙노트

[PYTHON] pandas.ExcelWriter를 사용하여 Excel 열 너비를 자동으로 조정하는 방법이 있습니까?

PYTHON

pandas.ExcelWriter를 사용하여 Excel 열 너비를 자동으로 조정하는 방법이 있습니까?

일부 Excel 보고서를 생성하도록 요청 받고 있습니다. 나는 현재 나의 데이터를 위해 팬더를 사용하고 있는데, 당연히이 보고서를 생성하기 위해 pandas.ExcelWriter 메서드를 사용하고 싶습니다. 그러나 고정 열 너비가 문제입니다.

지금까지 가지고있는 코드는 충분히 간단합니다. 'df'라는 데이터 프레임이 있다고 가정 해 보겠습니다.

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

팬더 코드를 조사하고 있었고 실제로 열 너비를 설정하는 옵션이 없습니다. 열이 데이터에 자동 조정되도록하려면 우주에 트릭이 있습니까? 아니면 열 너비를 조정하려면 사실 xlsx 파일을 할 수있는 일이 있습니까?

(나는 OpenPyXL 라이브러리를 사용하고 .xlsx 파일을 생성한다.

고맙습니다.

해결법

  1. ==============================

    1.user6178746의 답변에서 영감을 얻은 다음 다음과 같은 내용을 가지고 있습니다.

    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()
    
  2. ==============================

    2.아마도 지금은 자동으로 수행 할 방법이 없을 것입니다. 그러나 openpyxl을 사용할 때 다음 행 (사용자 Bufke가 수동으로 수행하는 방법에 대한 다른 답변에서 조정)을 사용하면 정당한 값 (문자 폭)을 지정할 수 있습니다.

    아마도 지금은 자동으로 수행 할 방법이 없을 것입니다. 그러나 openpyxl을 사용할 때 다음 행 (사용자 Bufke가 수동으로 수행하는 방법에 대한 다른 답변에서 조정)을 사용하면 정당한 값 (문자 폭)을 지정할 수 있습니다.

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

    3.방금 같은 문제가 발생하여 Xlsxwriter 및 pandas의 공식 설명서에이 기능이 아직 지원되지 않는 것으로 나열되어 있기 때문에 게시하고 있습니다. 나는 내가 가지고있는 문제를 해결하는 해결책을 함께 해킹했다. 기본적으로 각 열을 반복하고 worksheet.set_column을 사용하여 열 너비 == 해당 열의 내용의 최대 길이를 설정합니다.

    방금 같은 문제가 발생하여 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()
    
  4. ==============================

    4.최근에 StyleFrame이라는 멋진 패키지를 사용하기 시작했습니다.

    최근에 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.4에서는 best_fit 인수가 StyleFrame.to_excel에 추가되었습니다. 설명서를 참조하십시오.

  5. ==============================

    5.가장 쉬운 해결책은 set_column 메서드에서 열 너비를 지정하는 것입니다.

    가장 쉬운 해결책은 set_column 메서드에서 열 너비를 지정하는 것입니다.

        for worksheet in writer.sheets.values():
            worksheet.set_column(0,last_column_value, required_width_constant)
    
  6. from https://stackoverflow.com/questions/17326973/is-there-a-way-to-auto-adjust-excel-column-widths-with-pandas-excelwriter by cc-by-sa and MIT license