[python] openpyxl 사용법 및 필수예제 (엑셀자동화)
by cuore J- 설치 : pip install openpyx
- 홈페이지: https://openpyxl.readthedocs.io/en/stable/tutorial.html
1. 기본 지식 및 조작
필수예제를 통해 기본적인 사용법을 작성해 보겠습니다.. 우선 다음을 꼭! 기억해 주세요.
workbook: 엑셀 파일, worksheet: 엑셀 시트 cell: 엑셀 한 칸
그럼 아래와 같이 파일을 하나 생성해 볼게요(그대로 따라 하시면 됩니다.)
- 엑셀 파일 이름 : test.xlsx
- 엑셀 시트 이름 : worksheet, worksheet2
- B2 cell에 cell이란 글자 넣기
import openpyxl
#워크북 생성
wb = openpyxl.Workbook()
#시트 활성화
ws = wb.worksheets[0] # wb.active 로 써도 됨
#시트 이름바꾸기
ws.title = 'worksheet'
#새로운 시트만들기
ws2 = wb.create_sheet('worksheet2')
#두번째 worksheet2의 'B2'에 'cell' 쓰기
ws2['B2'] = 'cell'
# 워크북 filename 으로 저장(없으면 새로생성)
filename = "test.xlsx"
wb.save(filename)
2. Cell 꾸미기 (정렬, 굵게, 색깔, 테두리)
B2 cell에 적힌 문자열 "cell"을 여러 가지 방법으로 꾸며보겠습니다. 아래 예제의 4가지면 사실상 기본적인 꾸미기는 끝!
ws['B2'] = 'cell'
from openpyxl.styles import Alignment, Font, Border, Side, PatternFill
#가운데 정렬
align_center = Alignment(horizontal='center', vertical='center')
#글씨체 굵게
font_bold = Font(size=12, bold=True, color='000000') # 000000: black
#셀 색깔 채우기
fill_blue = PatternFill('solid', fgColor='819FF7')
# 테두리 선넣기
thin_border = Border(left=Side(border_style='thin', color='000000'),
right=Side(border_style='thin', color='000000'),
top=Side(border_style='thin', color='000000'),
bottom=Side(border_style='thin', color='000000'))
#위의 4가지 B2 cell에 적용시키기 + 값 'cell'에서 'text'로 바꾸기
ws['B2'].alignment = align_center
ws['B2'].font = font_bold
ws['B2'].fill = fill_blue
ws['B2'].border = thin_border
ws['B2'].value = 'text'
3-1. 여러 개의 Cell에 동시 접근하기 (worksheet [ ]로 접근하기)
cell을 여러 개로 접근하는 방법은 크게 두 가지가 있습니다. 우선 첫 번째로 worksheet[ ]로 접근하는 법을 익혀보겠습니다.
import openpyxl
# 시트 활성화
ws = wb.active
# 범위 지정
my_range =ws['A1':'B2']
print(my_range)
##출력 결과 - tuple로 반환된다!!! ##
'''((<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>), (<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>))'''
for row in my_range:
print(row)
##출력 결과 - tuple로 반환된다!! ##
'''
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>)
(<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>)
'''
for row in my_range:
for cell in row:
print(cell)
##출력 결과##
'''
<Cell 'Sheet'.A1>
<Cell 'Sheet'.B1>
<Cell 'Sheet'.A2>
<Cell 'Sheet'.B2>
'''
my_range 는 A1~B2까지의 cell을 모두 포함하고 있습니다. 따라서 ws[ ]를 통해 한 개의 cell이 아닌 여러 개의 cell을 tuple로 묶은 후, for 루프 문을 이용하여 각각의 cell에 접근할 수 있습니다. ws['A1':'B2'] 로 영역에 접근을 하게되면 tuple이 중복되며 반환을 하죠. (행 → 열 순서로 tuple이 생성됨)
하기 사용 예를 보면 이해되실 거예요.
my_range = ws['A1':'B2']
for row in my_range:
for cell in row:
cell.fill = fill_blue
cell.border = thin_border
cell.value = 'range'
3-2. 여러개의 Cell에 동시 접근하기 (worksheet.cell 로 접근하기)
3-1번 방법과 달리 이 방법이 편한 분이 있을 것 같아 추가로 정리해 드립니다.
for c in range(3):
ws.cell(row=1, column=c+1).value = 'text'
ws.cell(row=1, column=c+1).alignment = align_center
3-3. 여러개의 Cell에 동시 접근하기 (worksheet.append 사용)
이 예제는 생각보다 많이 사용 되어집니다. 이 방법을 사용하면 기존에 써있는 마지막 행의 다음 행!에 추가 됩니다.
ws.append(['first', 'second', 'third'])
ws.append(['1', '2', '3'])
ws.append([1, 2, 3])
4. cell size 조절, 병합, 날짜 기입
다음 예제를 천천히 읽어보시면 모두 이해, 응용이 되실거에요! 다만, 마지막 줄의 .encode( ) 이후 부분은 한글로 쓰다보니 인코딩 문제가 발생해서 사용하는 방법입니다.
# 행높이, 열너비 바꾸기
ws.row_dimensions[1].height= 30
ws.column_dimensions['A'].height = 30
# for문으로 행높이, 열너비 바꾸기
for row in range(1, 14):
ws.row_dimensions[row].height = 30
for col in range(65,70):
ws.column_dimensions[chr(col)].width = 20
# 병합하기
ws.merge_cells('C6:D6')
ws.unmerge_cells('C6:D6')
# 날짜 표기
import datetime
ws['A1'] = datetime.datetime.now()
ws['A2'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
ws['A3'] = datetime.datetime.now().strftime("%Y년 %m월 %d일".encode('unicode-escape').decode()).encode().decode('unicode-escape')
5. excel 읽기 ( +max row, column 알아내기)
코드를 실제로 사용하다 보면, 기존 엑셀 파일을 읽고, 열과 행의 개수 등을 알아야 하는경우가 생겨요. 그럴 때 이 예제를 보고 따라하시면 문제없이 해결될 거에요!
# 엑셀 읽기위해 필요한 모듈
from openpyxl import load_workbook
filepath = "test3.xlsx"
# load_workbook으로 load하기
wb = load_workbook(filepath)
ws = wb.active
# max_row 읽어들일수 있다!!
max_row = ws.max_row
# max_column 읽어들일 수 있다!
max_column = ws.max_column
# max row, col을 토대로 읽어들이기
for i in range(1, max_row + 1):
for j in range(1, max_column + 1):
# get particular cell value
print(ws.cell(row=i, column=j).value, end= ' | ')
print('\n')
도움되는 사이트들
[기본사용법] - 엑셀사진까지 같이나와 보기편함
http://zetcode.com/python/openpyxl/
[한국어 자료] - 가독성 좋은 두가지
https://gaussian37.github.io/python-etc-openpyxl/
https://book.coalastudy.com/data-crawling/week-5/stage-2
[도움된 자료]
블로그의 정보
cuore J
cuore J