Python - Excel 파일의 열 너비를 자동으로 조정합니다.
Newbie - 지정된 값에 따라 Excel 파일의 다른 열 너비를 조정하는 Python 스크립트를 가지고 있습니다.
import openpyxl
from string import ascii_uppercase
newFile = "D:\Excel Files\abc.xlsx"
wb = openpyxl.load_workbook(filename = newFile)
worksheet = wb.active
for column in ascii_uppercase:
if (column=='A'):
worksheet.column_dimensions[column].width = 30
elif (column=='B'):
worksheet.column_dimensions[column].width = 40
elif (column=='G'):
worksheet.column_dimensions[column].width = 45
else:
worksheet.column_dimensions[column].width = 15
wb.save(newFile)
(이 "if-elif-elif-......-elif-else" 구조를 사용하지 않고) 다른 열에 대해 명시적으로 지정하지 않고 모든 열의 너비를 가장 최적의 값으로 조정할 수 있는 방법이 있습니까?감사합니다!
for col in worksheet.columns:
max_length = 0
column = col[0].column_letter # Get the column name
for cell in col:
try: # Necessary to avoid error on empty cells
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2) * 1.2
worksheet.column_dimensions[column].width = adjusted_width
이것은 아마도 더 깔끔해질 수 있지만 효과가 있습니다.당신은 그것을 볼 때 당신이 사용하고 있는 글꼴에 무엇이 좋은지에 따라 adjusted_width 값을 가지고 놀고 싶을 것입니다.모노타이프를 사용하면 정확하게 알 수 있지만 일대일 상관관계는 아니기 때문에 조금 조정이 필요합니다.
모노타이프를 사용하지 않고 정확하고 세련되게 하려면 글자를 너비별로 정렬하고 각 너비에 플로트 값을 할당하여 추가할 수 있습니다.이를 위해서는 셀 값의 각 문자를 구문 분석하고 각 열에 대한 결과를 합산하는 세 번째 루프가 필요하며, 너비별로 문자를 정렬하는 사전 정렬이 필요합니다. 오버킬이 발생할 수도 있지만 그렇게 하면 멋집니다.
편집: 실제로 텍스트의 시각적 크기를 측정하는 더 나은 방법이 있는 것 같습니다. 링크 개인적으로 저는 매트플롯립 기법을 선호합니다.
제가 도움이 될 수 있기를 바랍니다, 저의 첫 번째 스택 오버플로 답변 =)
openpyxl 3.0.0에서 업데이트된 버전(.column 사용이 실패함)TypeError: expected <class 'str'>
:
for column_cells in ws.columns:
length = max(len(str(cell.value)) for cell in column_cells)
ws.column_dimensions[column_cells[0].column_letter].width = length
최신 openpyxl을 사용하면 다음을 사용할 수 있습니다.
from openpyxl.utils import get_column_letter
for idx, col in enumerate(worksheet.columns, 1):
worksheet.column_dimensions[get_column_letter(idx)].auto_size = True
위의 설명을 바탕으로 이 openpyxl 게시물을 추가합니다 - 열 너비 크기 조정.성공했지만 답은 다음과 같습니다.
from openpyxl.utils import get_column_letter
for col in ws.columns:
max_length = 0
column = get_column_letter(col[0].column) # Get the column name
# Since Openpyxl 2.6, the column name is ".column_letter" as .column became the column number (1-based)
for cell in col:
try: # Necessary to avoid error on empty cells
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 2) * 1.2
ws.column_dimensions[column].width = adjusted_width
저는 openpyxl = "^3.0.5"를 사용합니다.
merged_cells에 문제가 있고 autosize가 제대로 작동하지 않습니다. 같은 문제가 있다면 oldsea 코드 내부에 다음 줄을 추가하는 것을 해결할 수 있습니다.
for col in worksheet.columns:
max_length = 0
column = col[0].column # Get the column name
for cell in col:
if cell.coordinate in worksheet.merged_cells: # not check merge_cells
continue
try: # Necessary to avoid error on empty cells
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 2) * 1.2
worksheet.column_dimensions[column].width = adjusted_width
파일에 아래 줄의 코드를 삽입하기만 하면 됩니다.이상입니다(없는 경우 언급된 라이브러리 설치).
# Imorting the necessary modules
try:
from openpyxl.cell import get_column_letter
except ImportError:
from openpyxl.utils import get_column_letter
from openpyxl.utils import column_index_from_string
from openpyxl import load_workbook
import openpyxl
from openpyxl import Workbook
for column_cells in sheet.columns:
new_column_length = max(len(str(cell.value)) for cell in column_cells)
new_column_letter = (get_column_letter(column_cells[0].column))
if new_column_length > 0:
sheet.column_dimensions[new_column_letter].width = new_column_length*1.23
for column_cells in sheet.columns:
new_column_length = max(len(str(cell.value)) for cell in column_cells)
new_column_letter = (get_column_letter(column_cells[0].column))
if new_column_length > 0:
sheet.column_dimensions[new_column_letter].width = new_column_length*1.23
def auto_format_cell_width(ws):
for letter in range(1,ws.max_column):
maximum_value = 0
for cell in ws[get_column_letter(letter)]:
val_to_check = len(str(cell.value))
if val_to_check > maximum_value:
maximum_value = val_to_check
ws.column_dimensions[get_column_letter(letter)].width = maximum_value + 1
sheet.column_dimensions[new_column_letter].width = new_column_length*1.23
위의 코드 라인은 열 너비를 가장 잘 맞도록 조정합니다.
이것을 사용해 보세요, 저에게 효과가 있습니다.
from openpyxl.utils import get_column_letter
for columns in worksheet.columns:
col = get_column_letter(columns[0].column)
worksheet.column_dimensions[col].auto_size = True
pywin32는 Excel VBA를 반영하기 때문에 Python에서 Excel과 함께 작업하기에 더 좋은 패키지입니다.범위.AutoFit 방법으로 이 문제를 해결할 수 있습니다.아래의 예:
import win32com.client as win32
xlApp = win32.Dispatch('Excel.Application')
wb = xlApp.Workbooks.Open(***file path to excel file goes here***)
ws = wb.Worksheets[***name of worksheet trying adjust column width***]
ws.Columns.AutoFit()
참고: 워크시트.열 속성은 범위 개체를 나타냅니다.자동 맞춤은 Range 개체에 속하는 메서드입니다.
언급URL : https://stackoverflow.com/questions/39529662/python-automatically-adjust-width-of-an-excel-files-columns
'programing' 카테고리의 다른 글
원격 호스트가 연결을 닫았습니다.오류 코드는 0x800704입니다.CD (0) | 2023.06.15 |
---|---|
두 테이블을 비교하고 경기를 건너뛰는 방법은 무엇입니까? (0) | 2023.06.15 |
근거리 및 원거리 포인터 (0) | 2023.06.15 |
시스템JS와 함께 TypeScript에서 momentjs를 어떻게 사용합니까? (0) | 2023.06.15 |
MySQL/Maria에서만 명령을 프로시저로 제한DB (0) | 2023.06.15 |