Lined Notebook

[python] openpyxl 사용법 및 필수예제 (엑셀자동화)

by cuore J

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'

A1~B2 cell을 동시에 꾸미고 값을 넣었다.

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

블로그의 정보

cuore J

cuore J

활동하기