Python으로 openpyxl을 다룰 때 시트 조작이 빠질 수 없죠? Python openpyxl 시트 추가, 시트 삭제, 시트 이름 변경, 시트 위치 변경, 시트 복사 등 시트와 관련된 기능들을 함께 알아보도록 하겠습니다.
목차
Python openpyxl 시트 조작 방법 개요
기존에 있던 엑셀 파일의 시트 위치를 변경하거나 이름을 바꾸거나, 새로운 시트를 추가하거나, 기존의 시트를 삭제하는 경우가 있습니다. 이 모든 것은 openpyxl로 가능합니다. 어떻게 할 수 있는지 하나씩 확인해 보겠습니다.
시트 불러오기
시트 이름으로 시트 불러오기
특정 시트의 이름으로 시트를 불러오는 방법은 다음과 같이 워크북 뒤에 [] 안에 시트 이름을 적어주면 됩니다.
from openpyxl import Workbook
wb = Workbook()
ws = wb['Sheet']
Python과거에는 get_sheet_by_name 이라는 메서드를 사용했는데, DeprecationWarning이 뜨면서 위의 예시와 같이 사용하라고 안내해 줍니다.
시트 인덱스값으로 특정 시트 불러오기
특정 인덱스값을 사용해서 시트를 불러오고 싶다면, 워크북의 속성 worksheets의 인덱스 값을 활용해서 작업시트를 얻을 수 있습니다.
ws = wb.worksheets[0]
Python활성화된 시트 불러오는 방법
WorkSheet(작업시트)의 줄임말로 변수명은 ws로 많이 사용합니다. 워크북에서 활성화된 시트는 active 값으로 얻을 수 있습니다.
ws = wb.active
Python특정 시트를 활성화 상태로 만드는 법
활성화된 시트를 얻는 방법은 위에 소개했습니다. 정확하게 반대로 하면 특정 시트를 활성화된 시트로 변경할 수 있습니다. 위에서 본 코드와 반대로 아래와 같이 작성해 주면 됩니다.
wb.active = ws
Python시트 추가 방법
시트는 create_sheet 메소드를 사용해서 추가할 수 있습니다. 아래와 같이 하면 마지막 시트 다음에 ‘작업시트1’이 추가됩니다.
wb.create_sheet('작업시트1')
Python만약 위치를 지정해서 시트를 추가하고 싶다면, 시트의 인덱스 번호를 지정해 주면 됩니다. 아래와 같이 0번 인덱스로 잡아주면 첫 시트로 ‘작업시트1’이 추가되며, 기존의 시트는 인덱스 1 이하로 밀립니다. 여기에서 시트의 인덱스 번호는 0번부터 시작합니다. 즉, 0번 인덱스는 제일 첫 시트를 의미합니다.
wb.create_sheet('작업시트1', 0)
Python기존 시트 앞에 2개의 시트를 추가하고, 마지막에 한 개의 시트를 추가하고 싶다면 다음과 같이 하면 됩니다.
wb.create_sheet('작업시트1', 0)
wb.create_sheet('작업시트2', 1)
wb.create_sheet('작업시트3')
Python위와 같이 작업하면 아래 그림과 같이 시트가 배치된 것을 확인할 수 있습니다.
시트 삭제 방법 2가지
시트를 삭제하는 방법에는 2가지가 있습니다. 하나는 워크북의 remove 메서드를 사용하는 방법이고, 다른 하나는 del 명령어를 사용하는 방법입니다. 다음의 라인 2과 라인 4은 동일한 기능을 수행합니다. del 사용시에는 아래 코드와 같이 반드시 시트명을 사용해서 삭제하시기 바랍니다. worksheets를 활용한 인덱스 사용은 불가능합니다.
ws = wb['작업시트2']
wb.remove(ws)
# 또는
del wb['작업시트2']
Python그림 3과 같은 상태에서 작업시트2를 삭제하면 그림 4와 같이 됩니다.
참고로, remove_sheet 메서드는 레거시이며 사용할 때 DeprecationWarning을 만나게 됩니다. 아래 그림에서도 제가 안내한 것과 같이 remove 메서드를 사용하거나 del 명령어를 사용하라고 알려주네요.
시트 이름 변경
title 속성을 사용해서 작업시트의 이름을 바꿀 수 있습니다.
ws = wb['Sheet']
ws.title = '작업시트4'
Python아래와 같이 위의 그림 5에서의 2번째 시트 이름인 Sheet가 작업시트4로 변경된 것을 확인할 수 있습니다.
시트 위치 변경
특정 시트의 위치를 옮겨야 하는 경우가 있습니다. 워크북의 move_sheet 메서드를 사용하면 됩니다. 첫번째 파라미터로 작업시트를 넣어주고, 두번째 파라미터에는 오프셋을 넣어줍니다. 오프셋은 양수를 쓰면 오른쪽으로 이동하고, 음수를 쓰면 앞으로 이동합니다. 몇 칸이나 이동할 것인지를 숫자로 넣어주면 됩니다.
아래와 같이 하면 작업시트3이 왼쪽으로 한 칸 이동해서 작업시트1과 작업시트4 사이에 위치하게 됩니다.
wb.move_sheet(wb['작업시트3'], -1)
Python그림 6의 상태에서 위의 코드를 실행하면 그림 7과 같이 작업시트1, 3, 4의 순서로 시트가 배치됩니다.
시트 복사
워크북의 copy_worksheet 메서드를 사용해서 시트를 복사할 수 있습니다. 시트를 복사하면 시트 목록 제일 뒤에 복사된 시트가 추가됩니다.
wb.copy_worksheet(wb['작업시트3'])
Python위의 그림 7과 같은 상태에서 작업시트3을 복사하면 그림 8과 같이 시트목록의 가장 뒤에 복사된 시트가 추가됩니다.
주의사항: openpyxl 버전에 따른 문제
참고로 move_sheet() 메서드는 openpyxl 2.6.3에서 추가되었기 때문에 2.6.2 이하 버전을 사용하는 경우에는 아래와 같은 “AttributeError: ‘Workbook’ object has no attribute ‘move_sheet'” 오류 메시지를 만날 수 있습니다.
위와 같은 경우에는 openpyxl의 버전을 확인하고, openpyxl의 버전은 2.6.3 이상으로 업데이트해 주시면 됩니다. 아래의 명령어는 openpyxl의 버전을 확인하고, 최신 버전의 openpyxl로 업데이트 하는 명령어입니다. 관련 내용을 알려주신 Jason Choi님 고맙습니다.
pip list | grep openpyxl # 설치된 openpyxl 버전 확인
pip install --upgrade openpyxl # 최신 버전으로 openpyxl 업데이트
ShellScript정리
활성화된 시트 얻기, 특정 시트를 활성화 상태로 바꾸기, 인덱스를 사용해서 시트 얻기, 시트 이름으로 시트 얻기, 시트 추가, 시트 삭제, 시트 위치 변경, 시트 복사까지 시트와 관련된 활동을 모두 살펴봤습니다. openpyxl을 활용한 시트 작업에 도움이 되길 바랍니다.
관련 자료
Workbook 소스 코드와 openpyxl Tutorial 문서를 참고했습니다.
from openpyxl import*
이렇게 한다음에 모든 과정을 다 똑같이 따라했는데,
AttributeError: ‘Workbook’ object has no attribute ‘move_sheet’
이게 뜨는 이유는 대체 뭘까요?
확인해 보니 openpyxl 2.6.2 이전 버전을 사용하고 계시다면 발생할 수 있는 문제입니다. openpyxl 2.6.3 이후에 move_sheet() 메서드가 추가되었습니다.
pip list | grep openpyxl
명령어로 현재 설치된 openpyxl의 버전을 확인해 보시고, 버전이 낮다면 최신 버전을 이용해 보시기를 권합니다. 아래 명령어를 사용하면 최신 버전의 openpyxl로 업데이트 됩니다. 혹시 최신 버전을 이용하지 못하는 경우에는 2.6.3으로 최소한의 업데이트를 해서 이용하면 됩니다.
pip install --upgrade openpyxl # 최신 버전으로 업데이트
pip install openpyxl==2.6.3 # 버전 2.6.3 설치
부디 해결에 도움이 되시길 바랍니다.
해당 문제를 알려주셔서, 고맙습니다. 본 문서에도 관련 내용을 업데이트 하도록 하겠습니다.