본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] win32com.client 사용해서 엑셀 시트 다루기

반응형

* Win32com.client로 엑셀 다루기 포스팅

1편 : 2021.11.23 - [코딩/업무자동화] - [파이썬/업무자동화] win32com.client 사용해서 엑셀 사용하기 기초

2편 : 2021.12.14 - [코딩/업무자동화] - [파이썬/업무자동화] win32com.client 사용해서 엑셀 시트 다루기

3편 : 2021.12.22 - [코딩/업무자동화] - [파이썬/업무자동화] win32com.client 사용해서 엑셀 차트 다루기

4편 : 2021.12.30 - [코딩/업무자동화] - [파이썬/업무자동화] win32com.client 사용해서 엑셀 셀서식 지정하기

5편 : 2022.01.02 - [코딩/업무자동화] - [파이썬/업무자동화] win32com.client 사용해서 엑셀 영역 선택하는 방법 4가지 

6편 : 2022.01.17 - [코딩/업무자동화] - [파이썬/업무자동화] win32com.client 엑셀 파일 저장 및 옵션


  이 전에 openpyxl을 통해 Excel 시트를 다루는 법에 대해 설명한 적이 있다.

(참고링크 : 2021.11.09 - [코딩/업무자동화] - [파이썬/업무자동화] openpyxl 시트 조작 방법 4가지)

 

[파이썬/업무자동화] openpyxl 시트 조작 방법 4가지

※ OpenPyxl 관련 포스팅 모음 2021.03.19 - [코딩/업무자동화] - [파이썬/업무자동화] Openpyxl로 엑셀 함수 사용하기, 엑셀 수식 넣기 2021.08.21 - [코딩/업무자동화] - [파이썬/업무자동화] Openpyxl 통해 엑..

ybworld.tistory.com

 

 

  이번 포스팅은 win32com.client 모듈을 사용해서 엑셀의 시트를 제어하는 방법을 정리해보았다. 크게 다르지 않지만 win32com.client를 사용하면 Openpyxl에서 불가능한 파일간 시트이동/복사가 가능하다. 자세한 내용은 아래 2번에서 설명.

 

1. 시트 생성

 

  Worksheet를 생성하는 과정은 간단하다. Workbook 객체를 생성해서 Workbook에 대해 새로운 시트를 추가하는 것이다.

 

<코드>

import win32com.client

#엑셀 app 객체 생성 및 실행과정 보이게 설정(Visible)
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True

#기존에 있는 "data1.xlsx"파일을 Workbook 객체로 설정
wb1 = excel.Workbooks.Open(r"C:\Users\Desktop\VS CODE\Project\17. win32com\data1.xlsx")

#data1.xlsx 파일에 새로운 Worksheet 생성 및 ws1으로 객체 설정
ws1 = wb1.Worksheets.Add()

 

 

  기존에 있던 Sheet가 "test"였고, Worsheets.Add( )를 수행하면 "Sheet1"이라는 새로운 시트가 생성되었다. ws1이라는 변수는 "Sheet1"에 대한 Worksheet 객체 성질을 가지게 된다.

 

&amp;amp;amp;lt;결과&amp;amp;amp;gt;

 

  한번더 똑같은 코드를 실행해보자

 

<코드>

#data1.xlsx 파일에 새로운 Worksheet 생성 및 ws2으로 객체 설정
ws2 = wb1.Worksheets.Add()

 

  "Sheet2"가 새로 생성되고 ws2는 "Sheet2" 객체를 바인딩한 변수이다.

 

 

  만약, 위 처럼 Sheet를 새로 생성하지 않고 기존에 활성화 된 시트를 설정하는 방법은 아래와 같다. 위 이미지 기준으로 "Sheet2" 가 설정되게 된다.

 

<코드>

#현재 활성화되어 있는 시트를 객체로 설정
ws3 = wb1.ActiveSheet

 

  원래 있는 특정 시트를 시트명으로 접근하고 싶다면 코드를 아래와 같이 작성한다.

 

<코드>

#특정 시트명으로 접근
ws4 = wb1.Worksheets("sheet1")

 

 

 2. 시트 복사/이동

 

   서론에서도 설명한 부분이지만 win32com.client를 사용하면 다른 파일 간의 시트 이동/복사가 가능하다.

(참고로 엑셀 OpenPyxl 라이브러리는 다른 파일 간 이동/복사는 불가능 함.)

 

사용법은 아래와 같다.

 

먼저 설명을 위해  "data1.xlsx", "data2.xlsx" 다른 파일을 Workbook객체로 각각 생성 함.

 

wb1 = excel.Workbooks.Open(r"C:\Users\Desktop\VS CODE\Project\17. win32com\data1.xlsx")
wb2 = excel.Workbooks.Open(r"C:\Users\Desktop\VS CODE\Project\17. win32com\data2.xlsx")

 

그 다음 아래와 같이 코드를 작성해보았다.

 

wb1.Worksheets("test").Copy(Before=wb2.Worksheets("Sheet1"))

 

  위 코드의 의미는 첫번째 Workbook(wb1)의 시트 중 "test"라는 이름을 가진 시트를 두번째 Workbook(wb2)로 복사한다는 의미이다.

 

  Copy 내부의 Before라는 파라미터는 시트의 복사위치이다. 두번째 Workbook(wb2)의 시트 중 "Sheet1"이라는 시트의 앞에 복사한다는 의미. 아래 결과를 확인해보자

 

 

  Copy 대신 Move를 사용하면 시트 복사가 아닌 시트 이동이 된다는 점 참고하자!

 

 

3. 시트 삭제

 

  아래와 같이 코드를 작성하고 ws1이 "Sheet1"이라는 시트에 대한 변수라고 하자.

 

<코드>

wb1 = excel.Workbooks.Open(r"C:\Users\Desktop\VS CODE\Project\17. win32com\data1.xlsx")
ws1 = wb1.Worksheets.Add()

 

<결과>

 

위에서 "Sheet1"을 삭제하려면 ws1을 지우는 코드를 작성하면 된다.

 

<코드>

#ws1 Sheet 변수 삭제(실제 시트 삭제 됨)
ws1.Delete()

 

<결과>

 

  만약,  "test" Sheet를 삭제하고 싶다면 아래와 같이 코드를 작성한다. 물론 실행되진 않는다. 엑셀 파일에서는 최소 1개 시트가 있어야하기 때문에 위 이미지 기준으로는 오류가 발생한다. 만약, 여러 시트 중 특정 시트만 삭제하고 싶다면 해당 방법을 참고하면 된다.

 

 

<코드>

ws2 = wb1.Sheets("test")
ws2.Delete()

 

<결과>

 

 

4. 시트 이름 변경

 

  시트명을 바꾸려면 WorkSheet 개체의 .Name 속성을 활용하면 된다. 아래 코드는 위 이미지에서 "test" 라는 WorkSheet를 변수로 설정하고 이름을 바꾸는 코드이다.

 

 

<코드>

ws2 = wb1.Sheets("test")
ws2.Name = "시트명 이름 변경"

 

<결과>

728x90