엑셀과 파워포인트를 파이썬에서

엑셀과 파워포인트를 파이썬에서 연동시켜서 뭘 해보려고 했는데, 찾아보느라 삽질을 좀 했다. 그래서 다음과 같이 요약해 둔다.

from win32com import client # 엑셀이나 파워포인트를 파이썬에서 연결하려면 꼭 써야 하는 명령이다.

xl = client.Dispatch("Excel.Application") # 엑셀을 실행시켜서 파이썬에 연결한다.
xl.Visible = 1 # 엑셀 창을 눈에 보이게 할지 말지를 선택한다. 0은 안보임, 1은 보임.
xl.Quit() # 엑셀을 종료한다. 만약 client.Dispatch에서 xl1, xl2라는 식으로 엑셀을 두개 실행시켰으면 변수에 해당하는 엑셀만 종료된다.

myfile=xl.Workbooks.Open(filename) # 엑셀에 지정된 파일을 열도록 한다. 그리고 그 파일 핸들러를 myfile이라는 변수에 저장해서 쓸 수 있게 한다. Workbook이란 엑셀 파일을 뜻한다.
myfile.Save() # myfile에서 사용하고 있던 파일을 저장한다.
myfile.Close() # myfile에서 사용하고 있던 파일을 닫는다.

mynewfile=xl.Workbooks.Add() # 엑셀에서 새 파일을 연다. 그리고 그 파일 핸들러를 mynewfile이라는 변수에 저장해서 쓸 수 있게 한다.

아래에서, 시트는 워크시트와 차트시트를 포함하는 전체 시트다.

myfile.Sheets(sheet_no) # myfile에 있는 시트 중에 sheet_no를 선택한다. sheet_no는 정수(int)이거나 문자열이어서, 정수라면 그 시트의 번호를 말하고, 문자열은 그 시트의 이름을 말한다.
myfile.Worksheets(sheet_no) # myfile에 있는 워크시트 중에 sheet_no를 선택한다.
myfile.Charts(chart_no) # myfile에 있는 차트시트 중에 sheet_no를 선택한다.
myfile.Sheets(1).Name= "XYZ" # myfile에서 1번 시트의 이름을 "XYZ"로 고친다.

myfile.Worksheets(1).Range("F21").Value = 10 # myfile에서 1번 워크시트에 있는 "F21"이라는 셀의 값을 10으로 고친다.
myfile.Worksheets(1).Range("F21:G25").Value = 10 # myfile에서 1번 워크시트에 있는 "F21"에서 "G25"의 범위에 있는 셀의 값을 10으로 고친다.

myfile.Worksheets("결과").Range("A1:C10").Copy() # myfile에서 "결과"라는 워크시트에서 "A1"셀과 "C10"셀 범위의 셀들을 복사한다. 이것은 Ctrl-C를 눌러서 복사한 것과 같이 클립보드에 복사된다.
myfile2.Worksheets(3).Range("B2:D11").Select() # myfile2에서 3번 워크시트에 "B2"셀과 "D11"셀 범위의 셀들을 선택한다. 이것은 마우스로 드래그해서 선택한 것과 같다.
myfile2.Worksheets(3).Range("B2:D11").Paste() # 방금 고른 범위에 클립보드에 복사된 내용을 붙여넣기 한다 이것은 Ctrl-V로 붙여넣기 한 것과 같다. 복사할 때의 셀 범위의 크기와 붙여넣기 할 때의 셀 범위의 크기가 다르면 오류가 발생한다.

myfile2.Worksheets(3).Range("A1:C10").PasteSpecial(-4163) # PasteSpecial은 붙여넣기에 옵션을 주는 방법이다. 안에 들어간 숫자는 붙여넣기 할 때의 옵션을 정한다. 그 숫자의 의미는 https://learn.microsoft.com/ko-kr/office/vba/api/excel.xlpastetype 에서 찾아볼 수 있다.

myfile.Worksheets(2).Range("A3:R2863").AutoFilter(Field=9,Criteria1=">=400") # 주어진 범위에 필터를 주는 방법이다. Field=9는 가장 왼쪽인 A부터 시작해서 순서로 9번째인 I 열에 필터를 적용하겠다는 뜻이다. Criteria1>=400은 400보다 같거나 큰 값을 골라내겠다는 뜻이다. Criteria2도 지정 가능하다.
myfile.Worksheets(2).Range("A4:R2863").SpecialCells(12).Copy() # 여기서 SpecialCells는 셀 중에 원하는 것만 골라내는 방법이다. 12는 보이는 셀들만 고르겠다는 뜻이다. 숫자의 의미는 https://learn.microsoft.com/ko-kr/office/vba/api/excel.xlcelltype 에서 찾아볼 수 있다.

myfile.Worksheets(3).Range("A4").PasteSpecial(-4163) # 앞에서 설명했던 거라서 생략. 앞의 명령과 조합하면 2번시트에 있던걸 3번시트로 골라서 복사하는 명령이 된다. 단, 범위 선택을 이렇게 한 칸만 해주면, 나머지는 알아서 붙여넣기가 된다.
myfile.Worksheets(2).AutoFilterMode=False # 필터 붙였던걸 끄고 모든 항목이 나타나게 한다. 필터를 걸 때는 Range가 있었는데 끌 때는 없다는 것을 조심하자.

myfile.Worksheets("결과").Range("B4:F2863").Sort(Key1=myfile.Worksheets("결과").Range("B3"),Order1=1) # 정렬시키는 명령어. B4에서 F2862의 범위에 있는 값들을 정렬하는데, 그 기준을 B3의 열에 해당하는 값을 기준으로 삼겠다는 뜻이다. Order1은 1이 오름차순, 2가 내림차순이다. 자세한 것은 https://learn.microsoft.com/en-us/office/vba/api/excel.range.sort 을 참고하자.

이제 차트를 그려보자.

myfile.Worksheets(1).Shapes.AddChart(4,800,420,400,200).Select() # 일단 차트를 그리고 선택한다. Select()를 해주면 아래의 ActiveChart로 쓸 수 있다. Shapes에는 차트만 있는건 아니지만, 아무튼 여기서는 차트를 그릴 것이다. AddChart(차트 종류, 가로 위치, 세로 위치, 폭, 높이) 로 입력한다. 크기의 단위는 "포인트"다. 글자 크기를 이야기할 때의 그 포인트. 차트 종류는 숫자로 지정하는데, 원하는 모양에 따라 https://learn.microsoft.com/en-us/office/vba/api/excel.xlcharttype 을 참고해서 골라주자.
xl.ActiveChart.SetSourceData(Source=myfile.Worksheets("Cal").Range("F4:F20")) # 차트에 그림을 그릴 데이터를 지정한다.
xl.ActiveChart.HasTitle=True # 제목이 생기도록 한다.
xl.ActiveChart.HasLegend=False # 범례는 없도록 한다. True라고 적으면 범례가 나타난다.
xl.ActiveChart.ChartType=75 # 앞에 AddChart에서 아무 숫자나 넣어서 차트를 만들고, 여기서 차트 종류를 바꿔도 된다. 원하는 모양에 따라 https://learn.microsoft.com/en-us/office/vba/api/excel.xlcharttype 을 참고해서 골라주자.
xl.ActiveChart.Axes(1).MajorUnit=50 # X축의 눈금 단위 50마다 하나씩 적기로 한다. 자매품으로 MinorUnit도 있다. Y축을 바꾸고 싶으면 Axes(2)를 쓰자.
xl.ActiveChart.ChartTitle.Characters.Font.Size=12 # 제목의 글자 크기를 12포인트로 정한다.
xl.ActiveChart.ChartTitle.text = myfile.Worksheets(2).Range("F3").Value # 제목 내용을 다른 셀에서 가져올 수도 있다.

xl.ActiveChart.SeriesCollection().NewSeries() # 차트 하나에 그래프를 두개 그리고 싶을 때 쓴다.
xl.ActiveChart.FullSeriesCollection(2).Name = "" # 범례에 들어갈 이름이다. 여기서는 빈칸을 뜻한다.
xl.ActiveChart.FullSeriesCollection(2).XValues = myfile.Worksheets("Cal").Range("A4:A20") # 추가할 그래프의 X축 값들이다.
xl.ActiveChart.FullSeriesCollection(2).Values = myfile.Worksheets("Cal").Range("W4:W20") # 추가할 그래프의 Y축 값들이다.
xl.ActiveChart.FullSeriesCollection(2).Format.Line.Weight=3 # 추가할 그래프의 굵기다.
xl.ActiveChart.FullSeriesCollection(2).Format.Line.Visible=True # 추가할 그래프를 보이게 설정한다.
xl.ActiveChart.FullSeriesCollection(2).Format.Line.ForeColor.RGB=255 # 추가할 그래프의 색을 정한다. 255라고 쓰면 빨간색이다.

myfile.Worksheets(1).ChartObjects(2).Copy() # 1번 워크시트에서 차트 2번을 고른다. ChartObjects는 생성된 순서대로 번호가 붙는다고 생각하면 된다. 즉, ChartObjects(2)는 그 시트에서 2번째로 생성된 차트를 고른다. 다른데 붙여넣고 싶으니까 Copy()를 했다.

myfile.Worksheets(1).Columns("A").ColumnWidth = 8.38 # 워크시트 1번의 A열의 폭을 8.38로 정한다. 단위는 포인트다.

파워포인트를 써 보자.

ppt= client.Dispatch("PowerPoint.Application") # 파이썬에 파워포인트를 연결한다.
ppt.Quit() # 파워포인트를 종료시킨다.
presentation=ppt.Presentations.Add() # 새 프리젠테이션 파일을 생성한다. 원한다면 엑셀에서처럼 Open("파일이름")을 쓸 수도 있다.
presentation.Save() #파일을 저장한다.
presentation.SaveAs() # 파일을 다른 이름으로 저장한다.

presentation.Slides.Add(4,12) # 새 슬라이드를 4번째 위치에 넣는다. 즉, 새로 만들어진 슬라이드가 4페이지다. 12는 레이아웃을 정하는 숫자인데, 그중에서도 12는 빈 슬라이드다. 다른 것도 써보자.

presentation.Slides(4).Shapes.PasteSpecial(DataType=1) # 앞에 엑셀에서 복사한 차트를 붙여넣기 할 수 있다. DataType=1이라는 옵션은 그림으로 붙여넣기 하겠다는 뜻이다. 다르게 붙여넣고 싶으면 https://learn.microsoft.com/en-us/office/vba/api/powerpoint.pppastedatatype 을 참고해서 다른 숫자를 적자.
presentation.Slides(4).Shapes(1).LockAspectRatio=False # 그림을 붙여넣기 할 때, 가로-세로 비율을 고정하지 않고 내 맘대로 정하고 싶을 때가 있는데 그때 False를 쓴다. 고정시키려면 True를 쓴다.
presentation.Slides(4).Shapes(1).Left=20 # Shapes(1)은 1번째로 만들어진 그림을 고른다는 뜻이다. 여기서도 만들어진 순서대로 그림을 고를 수 있다. Left는 그림의 왼쪽 위를 기준으로 한 그림의 가로 위치다.
presentation.Slides(4).Shapes(1).top=50 # Top는 그림의 왼쪽 위를 기준으로 한 그림의 세로 위치다.
presentation.Slides(4).Shapes(1).Width=400 # Width는 그림의 폭이다.
presentation.Slides(4).Shapes(1).Height=200 # Height는 그림의 높이다.

tb=presentation.slides(4).Shapes.AddTextbox(1,50,25,200,50) # 4번 슬라이드에 텍스트박스를 추가한다.
tb.TextFrame2.TextRange.Characters.Text="내용적기" # 방금 만든 텍스트박스의 내용을 적는다.
TextFrame2.TextRange의 뜻은 구글에서 찾아보도록 하자.


게시됨

카테고리

,

작성자

댓글

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.