일부 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