[Python] 파이썬 자동화 기초 : 오픈파이엑셀(openpyxl) 엑셀 자동화 명령어 모음

[Python] 파이썬 자동화 기초 : 오픈파이엑셀(openpyxl) 엑셀 자동화 명령어 모음

오픈파이엑셀(openpyxl)는 파이썬에서 엑셀 파일을 조작할 수 있도록 돕는 라이브러리다.

이 포스트는 오픈파이엑셀(openpyxl)을 이용한 파이썬 자동화 명령어를 정리했다.

오픈파이엑셀(openpyxl) 설치

pip install openpyxl

1. 엑셀파일 다루기

1-1. 새 엑셀파일 생성하기 & 엑셀파일 저장하기

from openpyxl import Workbook # 새 엑셀파일 생성 wb = Workbook() ##### 이 위치에 엑셀파일 다루는 로직작성하면 됨 # ex) ws = wb.active # 엑셀파일 저장 wb.save(“filename.xlsx”) wb.close()

1-2. 기존 엑셀파일 불러오기 & 엑셀파일 저장하기

from openpyxl import load_workbook # 기존 엑셀파일 불러오기 wb = load_workbook(“filename.xlsx”) ##### 이 위치에 엑셀파일 다루는 로직작성하면 됨 # ex) ws = wb.active # 엑셀파일 저장 wb.save(“filename.xlsx”) wb.close()

2. 워크시트 다루기

2-1. 새 워크시트 생성하기

(1) 새로운 시트 생성 : 기본이름으로 생성

# 새로운 시트 생성 : 기본이름으로 생성 ws = wb.create_sheet()

(2) 새로운 시트 생성 : 지정한 이름으로 생성

# 새로운 시트 생성 : 지정한 이름으로 생성 ws = wb.create_sheet(“새로운 시트명”)

(3) 새로운 시트 생성 : 시트위치 인덱스 지정

# 새로운 시트 생성 : 시트위치 인덱스 지정 ws = wb.create_sheet(“새로운 시트명”, 0)

2-2. 기존 워크시트 가져오기

(1) 현재 활성화된 시트 가져오기

# 현재 활성화된 시트 가져오기 ws = wb.active

(2) 시트명으로 시트 가져오기

# 워크북에서 시트명으로 접근 가능 # 딕셔너리(Dict) 형태로 시트에 접근 가능 ws = wb[“새로운 시트명”]

cf) 모든 시트이름 확인하기

# 모든 시트이름 확인 print(wb.sheetnames)

2-3. 워크시트 속성 변경

* 시트명 변경

# 시트명 변경 ws.title = “새로운 시트명”

* 시트명 탭 색상지정

# 시트명 탭 색상지정 (RGB 값 입력) ws.sheet_properties.tabColor = “0000FF”

2-4. 시트 복사하기

target = wb.copy_worksheet(ws) target.title = “복사된 시트”

3. 셀 다루기

3-1. 셀 객체 가져오기

# 셀 객체 가져오기 (문자열 주소를 이용) ws[“A1”] ws[“B1”] # 셀 객체 가져오기 (로우 값과 컬럼 값을 이용) ws.cell(row=1, column=1) ws.cell(row=1, column=2)

3-2. 셀 값 가져오기

# 셀 값 가져오기 (문자열 주소를 이용) ws[“A1”].value ws[“B1”].value # 셀 값 가져오기 (로우 값과 컬럼 값을 이용) ws.cell(row=1, column=1).value ws.cell(row=1, column=2).value # 만약 값이 없을 때는 None을 가져오게 됨 ws[“A10”].value

cf) 반복문을 활용한 셀 값 가져오기

# 셀 값 출력하기 (지정된 범위) # 10개 row 곱하기 10개 column 에 대해서 값을 출력하기 for x in range(1, 11): for y in range(1, 11): print(ws.cell(row=x, column=y).value, end=” “) print() # 셀 값 출력하기 (전체 row 와 column 범위) for x in range(1, ws.max_row + 1): for y in range(1, ws.max_column + 1): print(ws.cell(row=x, column=y).value, end=” “) print()

3-3. 셀 값 변경하기

# 셀 값 변경하기 (문자열 주소를 이용) ws[“A1”].value = 10 # 셀 값 변경하기 (로우 값과 컬럼 값을 이용) ws.cell(row=1, column=1, value=10)

cf) 랜덤값을 활용한 셀 값 변경하기

# 셀 값을 랜덤값으로 변경하기 첫번째 # A1 셀에 0 에서 100 사이의 숫자 대입 from random import * ws.cell(row=1, column=1, value=randint(0, 100)) # 셀 값을 랜덤값으로 변경하기 두번째 # 10개 row 곱하기 10개 column 에 대해서 값으로 0 에서 100 사이의 숫자 대입 from random import * for x in range(1, 11): for y in range(1, 11): ws.cell(row=1, column=1, value=randint(0, 100))

3-4. 셀 객체의 주소 가져오기 (cell.coordinate)

from openpyxl.utils.cell import coordinate_from_string # A2 셀 객체 cell = ws[“A2”] # A2 셀 값 print(cell.value) # A2 print(cell.coordinate) # (‘A’, 2) cell_tuple = coordinate_from_string(cell.coordinate) # A print(cell_tuple[0]) # 2 print(cell_tuple[1])

3-5. 셀 병합하기 / 셀 병합해제

(1) 셀 병합하기

# 셀 병합하기 ws.merge_cells(“B2:D2”) # B2부터 D2까지 합치기 ws[“B2”].value = “병합한 셀 값”

(2) 셀 병합 해제하기

# B2:D2 병합되어 있던 셀을 병합해제 ws.unmerge_cells(“B2:D2”)

4. 로우(row), 컬럼(column) 다루기

4-1. 로우, 컬럼 추가하기

(1) 새 로우 추가하기

# 8번째 줄에 새 로우를 추가하기 ws.insert_rows(8)

# 8번째 줄에 5줄을 추가하기 ws.insert_rows(8, 5)

(2) 새 컬럼 추가하기

# B열에 새 컬럼을 추가하기 ws.insert_cols(2)

# B열에 새 컬럼을 5열 추가하기 ws.insert_cols(2, 5)

4-2. 로우, 컬럼 삭제하기

(1) 기존 로우 삭제하기

# 8번째 줄 삭제하기 ws.delete_rows(8)

# 8번째 줄부터 5줄 삭제하기 ws.delete_rows(8, 5)

(2) 기존 컬럼 삭제하기

# B열 삭제하기 ws.delete_cols(2)

# B열부터 3개 열 삭제하기 ws.delete_cols(2, 3)

4-3. 로우, 컬럼 이동하기

# C1:C11 범위의 내용을 오른쪽으로 1열 이동하기 ws.move_range(“C1:C11”, rows=0, cols=1) # 이동하려는 범위를 먼저 정의하고, 현재 셀 기준에서 이동시킬 위치 지정 # rows 값이 음수일 경우 위로 이동, rows 값이 양수일 경우 아래로 이동 # cols 값이 음수일 경우 왼쪽으로 이동, cols 값이 양수일 경우 오른쪽으로 이동

4-4. 한 줄씩 데이터 넣기 (1 row 씩 데이터 추가)

# 한 줄씩 데이터 넣기 ws.append([“컬럼A”, “컬럼B”, “컬럼C”])

cf) 한 줄씩 데이터 넣기를 10번 반복

# 한 줄씩 데이터 넣기를 10번 반복 from random import * for i in range(1, 11): ws.append([i, randint(0, 100), randint(0, 100)])

4-5. 특정한 1개 row, column 가져오기

(1) 1개 로우 가져오기 (튜플 형태로 리턴)

# 1번째 row만 가져오기. 튜플 형태로 여러 cell 들을 가져옴 => (셀, 셀, 셀…) row = ws[1] # 셀 값 출력 for cell in row: print(cell.value, end=” “)

(2) 1개 컬럼 가져오기 (튜플 형태로 리턴)

# B 컬럼만 가져오기. 튜플 형태로 여러 cell 들을 가져옴 => (셀, 셀, 셀…) col = ws[“B”] # 셀 값 출력 for cell in col: print(cell.value, end=” “)

4-6. 여러개 row, column 가져오기

(1) 여러개 로우 가져오기 (이중튜플 형태로 리턴)

# 2번째부터 6번째 row까지 가져오기. 이중튜플 형태임 => ((셀, 셀, 셀…), (셀, 셀, 셀…)) row_range = ws[2:6] # 아래 row 변수가 튜플 형태임 => (셀, 셀, 셀…) for row in row_range: for cell in row: print(cell.value, end=” “) print()

참고로 2번째 줄부터 마지막 줄까지 가져오기

# 2번째 줄부터 마지막 줄까지 데이터 가져오기 row_range = ws[2:ws.max_row]

(2) 여러개 컬럼 가져오기 (이중튜플 형태로 리턴)

# B 컬럼부터 C 컬럼 가져오기. 이중튜플 형태임 => ((셀, 셀, 셀…), (셀, 셀, 셀…)) col_range = ws[“B:C”] # 아래 col 변수가 튜플 형태임 => (셀, 셀, 셀…) for col in col_range: for cell in col: print(cell.value, end=” “) print()

4-7. 전체 row, column 가져오기

(1) 전체 로우 가져오기 (이중튜플 형태로 리턴)

# 전체 rows print(ws.rows) # => 알 수 없는 정보가 출력되므로 튜플로 감싸주자 # 이중튜플 형태임 => ((셀, 셀, 셀…), (셀, 셀, 셀…)) print(tuple(ws.rows)) # 각 로우 튜플의 첫번째 값만 출력. 즉 A1, A2, A3… 출력 for row in tuple(ws.rows): print(row[0].value)

(2) 전체 컬럼 가져오기 (이중튜플 형태로 리턴)

# 전체 columns print(ws.columns) # => 알 수 없는 정보가 출력되므로 튜플로 감싸주자 # 이중튜플 형태임 => ((셀, 셀, 셀…), (셀, 셀, 셀…)) print(tuple(ws.columns)) # 각 컬럼 튜플의 첫번째 값만 출력. 즉 A1, B1, C1… 출력 for col in tuple(ws.columns): print(col[0].value)

4-8. 이터레이터 활용해서 row, column 가져오기

# 이터레이터를 활용해서 전체 row 가져오기 for row in ws.iter_rows(): print(row) # 이터레이터를 활용해서 전체 col 가져오기 for column in ws.iter_cols(): print(column)

# min_row, min_col, max_row, max_col 이 존재함 # 일부를 잘라서 출력 (1번째 줄부터 5번째 줄까지 출력) # iter_rows 이므로 반복문은 5번 돌게됨 (1 ~ 5) for row in ws.iter_rows(min_row=1, max_row=5): print(row) # 일부를 잘라서 출력 (1번째 줄부터 5번째 줄까지 출력, 2번째 열부터 3번째 열까지) # iter_rows 이므로 반복문은 5번 돌게됨 (1 ~ 5) for row in ws.iter_rows(min_row=1, max_row=5, min_col=2, max_col=3): print(row) # 일부를 잘라서 출력 (1번째 줄부터 5번째 줄까지 출력, 2번째 열부터 3번째 열까지) # iter_cols 이므로 반복문은 2번 돌게됨 (2 ~ 3) for col in ws.iter_cols(min_row=1, max_row=5, min_col=2, max_col=3): print(col)

참고사이트 1 : openpyxl 라이브러리 공식문서 https://openpyxl.readthedocs.io/

참고사이트 2 : 나도코딩 https://www.youtube.com/watch?v=exgO1LFl9x8&t=4285s