IT Share you

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

shareyou 2020. 12. 1. 20:01
반응형

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


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

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

writer = pd.ExcelWriter(excel_file_path)
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()

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

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

방금 동일한 문제가 발생하여 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()

최근에 사용하기 시작한 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. 설명서를 참조하십시오 .


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

import re
import openpyxl
..
for col in _ws.columns:
    max_lenght = 0
    print(col[0])
    col_name = re.findall('\w\d', str(col[0]))
    col_name = col_name[0]
    col_name = re.findall('\w', str(col_name))[0]
    print(col_name)
    for cell in col:
        try:
            if len(str(cell.value)) > max_lenght:
                max_lenght = len(cell.value)
        except:
            pass
    adjusted_width = (max_lenght+2)
    _ws.column_dimensions[col_name].width = adjusted_width

I found that it was more useful to adjust the column with based on the column header rather than column content.

Using df.columns.values.tolist() I generate a list of the column headers and use the lengths of these headers to determine the width of the columns.

See full code below:

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

Easiest solution is to specify width of column in set_column method.

    for worksheet in writer.sheets.values():
        worksheet.set_column(0,last_column_value, required_width_constant)

Combining the other answers and comments and also supporting multi-indices:

def autosize_excel_columns(worksheet, df):
  autosize_excel_columns_df(worksheet, df.index.to_frame())
  autosize_excel_columns_df(worksheet, df, offset=df.index.nlevels)

def autosize_excel_columns_df(worksheet, df, offset=0):
  for idx, col in enumerate(df):
    series = df[col]
    max_len = max((
      series.astype(str).map(len).max(),
      len(str(series.name))
    )) + 1
    worksheet.set_column(idx+offset, idx+offset, max_len)

sheetname=...
df.to_excel(writer, sheet_name=sheetname, freeze_panes=(df.columns.nlevels, df.index.nlevels))
worksheet = writer.sheets[sheetname]
autosize_excel_columns(worksheet, df)
writer.save()

참고URL : https://stackoverflow.com/questions/17326973/is-there-a-way-to-auto-adjust-excel-column-widths-with-pandas-excelwriter

반응형