반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

오늘은 파이썬으로 엑셀(Excel)을 다룰 때 가장 많이 사용하는 openpyxl 패키지에 대해 알아보겠습니다.

엑셀은 회사에서 업무할 때 정말 많이 사용하는 오피스 프로그램이니 알아두시면 많은 도움이 되실거라 생각합니다!

 

지난 시간에 배운 내용과 관련된 코드는 설명없이 넘어 갈 예정이니, 아래 내용을 모르신다면 읽고 오시는 것을 추천드립니다.

 

2021.05.28 - [파이썬 패키지/사무자동화] - [Python Excel] 파이썬으로 엑셀 다루기 1편_openpyxl 패키지 소개 및 시트 생성/변경

2021.05.29 - [파이썬 패키지/사무자동화] - [Python Excel] 파이썬으로 엑셀 다루기 2편_엑셀 파일 불러오기, 셀 데이터 입력/삭제 및 빈칸 추가

 


 

1. 셀 단위 가져오기

 

만약 B1 셀의 데이터만 가져오려면 두 가지 방법으로 가능합니다.

 

1) ws['B1'].value

2) ws.cell(row=1, column=2).value

 

참고로 .value를 붙여주지 않으면 <Cell '시트명'.B1> 와 같은 형식으로 값을 리턴합니다.

 

먼저 지난 시간에 배웠던대로 개별 셀에 데이터를 입력해보겠습니다.

# A4와 B1 셀에 데이터 입력
ws['A4'] = 10
ws.cell(row=1, column=2, value=15)

 

그럼 현재는 이런 상태이겠죠?

이제 이 값들을 가져와 보겠습니다.

 

<엑셀 포맷(알파벳+숫자)의 인덱싱 방식>


# 해당 위치의 데이터 확인
a = ws['A4']
print(a)
>>> <Cell '시트명'.A4>

b = ws['A4'].value
print(b)
>>> 10

 

<openpyxl 포멧(숫자, 숫자)의 인덱싱 방식>

c = ws.cell(row=1, column=2)
print(c)
>>> <Cell '시트명'.B1>

d = ws.cell(row=1, column=2).value
print(d)
>>> 10

 

직관적인 면에서는 'A4'와 같은 인덱싱 방법이 더 편하지만, 나중에 for문에서 row나 column을 변환시키면서 코딩해야할 때는 ws.cell( ) 방식을 사용해야만 하는 경우가 있답니다.

 

대략 이런 경우에 말이죠.

for x in range(1,101):
	for y in range(1,101):
		ws.cell(row=x, column=y)

 

2. 범위로 가져오기

 

당연히 범위로도 셀 값을 가져올 수 있습니다.

 

<엑셀 포맷(알파벳+숫자)의 인덱싱 방식>

# A1:B4 범위의 셀 정보 가져오기
cell_range = ws['A1:B4']

# 가져온 cell_range(이차원 튜플)의 내용 하나씩 print
for i in cell_range:
    for j in i:
        print(j.value)
        
>>> 
None
15
None
None
None
None
10
None

 

<openpyxl 포멧(숫자, 숫자)의 인덱싱 방식>

 

iter_rows( ) 혹은 iter_cols( ) 함수로 행/열의 최소 최대를 입력해줌으로써 범위 내의 데이터를 가져올 수 있습니다.

 

아래의 코드를 보시고 두 함수가 값을 가져오는 순서 차이를 이해하고 넘어가시는 걸 추천드립니다.

(순서 차이를 위해서 cell을 print했으며, cell.value를 입력해주면 cell 안의 값을 출력합니다)

# 행 단위로 가져옴
for row in ws.iter_rows(min_row=1, max_row=4, min_col=1, max_col=2):
    for cell in row:
	    print(cell)
>>> 
<Cell 'Sheet1'.A1>
<Cell 'Sheet1'.B1>
<Cell 'Sheet1'.A2>
<Cell 'Sheet1'.B2>
<Cell 'Sheet1'.A3>
<Cell 'Sheet1'.B3>
<Cell 'Sheet1'.A4>
<Cell 'Sheet1'.B4>


# 열 단위로 가져옴
for col in ws.iter_cols(min_row=1, max_row=4, min_col=1, max_col=2):
	for cell in col:
		print(cell)
>>> 
<Cell 'Sheet1'.A1>
<Cell 'Sheet1'.A2>
<Cell 'Sheet1'.A3>
<Cell 'Sheet1'.A4>
<Cell 'Sheet1'.B1>
<Cell 'Sheet1'.B2>
<Cell 'Sheet1'.B3>
<Cell 'Sheet1'.B4>

 

3. 행/열 단위 가져오기

 

셀을 행이나 열 단위로 가져오는 것도 가능합니다. 방금 전 위에서 배웠던 범위와 같은 방식입니다.

다만 인덱싱을 2차원이 아닌 1차원(only 행 or only 열)로 입력해주는 것만 다를 뿐이죠.

 

<엑셀 포맷(알파벳+숫자)의 인덱싱 방식>

# 열 하나 가져오기
col_C = ws['C']
for cell in col_C:
	print(cell.value)

# 열 여러개 가져오기
col_range = ws['B:C']
for cols in col_range:
    for cell in cols:
        print(cell.value)

# 행 하나 가져오기 (for 문 생략_위와 동일)
row10 = ws[10]

# 행 여러개 가져오기 (for 문 생략_위와 동일)
row_range = ws[5:10]

 

<openpyxl 포멧(숫자, 숫자)의 인덱싱 방식>

 

위에서 배웠던 iter_rows( ), iter_cols( ) 함수에서 행이나 열의 max값을 생략해주면 됩니다.

여기서는 자세한 내용을 생략하고 좀 더 자주 사용할만한 개념을 소개드리겠습니다.  

 

만약 범위를 지정하기보다 모든 행이나 열을 참조해야하는 경우는 ws.row나 ws.columns를 사용할 수 있습니다.

이 개념은 계속 데이터가 추가되어서 최대 범위가 계속 바뀔 때 유용하게 사용할 수 있답니다. 

 

ws = wb.active
ws['C9'] = 'hello world'

tuple(ws.rows)

>>> 
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
(<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))


tuple(ws.columns)

>>> 
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
<Cell Sheet.A4>,
<Cell Sheet.A5>,
<Cell Sheet.A6>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
<Cell Sheet.C2>,
<Cell Sheet.C3>,
<Cell Sheet.C4>,
<Cell Sheet.C5>,
<Cell Sheet.C6>,
<Cell Sheet.C7>,
<Cell Sheet.C8>,
<Cell Sheet.C9>))

 

오늘 준비한 내용은 여기까지입니다.

 

공부하시느라 고생 많으셨습니다.

반응형

+ Recent posts