본문 바로가기
아래아한글 자동화/python+hwp 중급

[교육업무자동화3/7] 청구서자동화3(파이썬으로 엑셀 열어서 값 얻기)

by 일코 2021. 1. 22.

지난 포스팅은...

 

[교육업무자동화2/10] 청구서자동화2(필드에 텍스트 자동입력)

지난 포스팅은... [교육업무자동화1/10] 청구서자동화1(누름틀 다루기) (전략) 우리 ㅇㅇㅇㅇㅇㅇ협회 교육운영팀은 20XX년부터 고용노동부 국가인적자원개발 컨소시엄 사업으로 전환하여 비회원

www.martinii.fun

 


 

지난 시간에는 파이썬으로 한/글 파일을 열고 누름틀 목록을 가져오거나, 누름틀에 값을 입력하는 방법을 알아보았다.
그 과정에서 파이썬의 기본자료형인 list와, 기초문법 중 하나인 for문, 그리고 enumerate 등을 사용해서
field_list와 text_list를 1:1로 매칭하여 대입하는 방법을 사용해보았다.

지난 과정이 이해되었다면, 이번 포스팅은 굉장히 단순하게 느껴질 것이다.
왜냐면, 엑셀파일을 열어서 한 개의 행을 파이썬의 text_list로 가져오는 게 전부이기 때문이다.

 


 

1. 파이썬으로 엑셀을 열자.

혹시라도 이 튜토리얼을 하나씩 따라하고 있을 독자분들의 귀찮음을 해소하기 위해
아래와 같이 예제용 엑셀파일을 만들어놓았으니, 활용해주기 바란다.

교육생리스트#마티니한잔.xlsx
0.01MB

이전 포스팅에서는 아래 코드를 사용해 파이썬으로 한/글을 열었는데,

import win32com.client as win32
hwp = win32.Dispatch("HWPFrame.HwpObject")
hwp.Open(파일경로)
hwp.XHwpWindows.Item(0).Visible = True


이번에는 파이썬으로 엑셀을 열어보자.
코드는 위와 상당히 비슷해 보인다.

import win32com.client as win32
excel = win32.gencache.EnsureDispatch("Excel.Application")
wb = excel.Workbooks.Open(파일경로)
ws = workbook.Worksheets(1)
excel.Visible = True

한/글과 마찬가지로 Visible =  True를 실행하기 전에는 백그라운드에 숨겨져 있으니 유의하기 바란다.

 


 

2. 파이썬으로 셀의 값을 읽어보자.

열린 엑셀파일은 아래처럼 생겼다.

이름같은 이름을 넣으려다 마티니백잔까지... 젓지말고 흔들어서(뭔소리지;;;)

셀의 값을 읽는 메서드는 대표적으로 두 가지가 있는데, Cells와 Range이다.
사용법을 하나하나 설명하는 것보다는 아래의 예시를 보면 어느 정도 이해가 될 것이다.

셀주소를 이용해서 값에 "직접" 접근하는 Cells와 Range 메서드

셀주소를 이용한 더 심도있는 탐색법은 아래 포스팅을 참고하기 바람.

 

1. 파이썬으로 엑셀프로그램을 열고, 값을 입력해봅시다.

아래아한글 자동화기초 1번에서 아나콘다와 파이참을 설치했습니다. 엑셀 자동화도 동일한 프로그램으로 진행할 예정이므로 위 두 개의 프로그램을 먼저 설치해 주시기 바랍니다. VSCode나 노트

www.martinii.fun

 


3. text_list를 한/글에 넣어보자.

위 캡쳐화면의 아랫쪽 코드를 보면 text_list를 지정하는 코드가 씌어 있다.

text_list = ws.Range(ws.Cells(2, 1), ws.Cells(2, 6)).Value[0]

for문과 range 함수를 통해 "2행"을 가리키는 "2"만 바꿔가면서 101행까지 순회하면서 text_list를 만들고,

해당 text_list를 통해 한/글 문서를 완성하면 되겠다. 간단하지 않음?

이런 식으로 하면 된다.

text_list = ws.Range(ws.Cells(2, 1), ws.Cells(2, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(3, 1), ws.Cells(3, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(4, 1), ws.Cells(4, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(5, 1), ws.Cells(5, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(6, 1), ws.Cells(6, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(7, 1), ws.Cells(7, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(8, 1), ws.Cells(8, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(9, 1), ws.Cells(9, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(10, 1), ws.Cells(10, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(11, 1), ws.Cells(11, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(12, 1), ws.Cells(12, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(13, 1), ws.Cells(13, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(14, 1), ws.Cells(14, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드
text_list = ws.Range(ws.Cells(15, 1), ws.Cells(15, 6)).Value[0]
# text_list를 한/글 필드에 삽입하는 코드

농담이다;;;;;;;; 위의 코드를 for문을 사용해서 간략히 써보자.

for idx in range(2, 102):
	text_list = ws.Range(ws.Cells(idx, 1), ws.Cells(idx, 6)).Value[0]
    # text_list를 한/글 필드에 삽입하는 코드
    

for문과 range를 통해 엑셀파일의 행을 순회하면서 text_list를 생성함

그러면 #text_list를 한/글 필드에 삽입하는 코드만 가져와서
스크립트를 완성해보자.

for 행번호 in range(2, 102):
	text_list = ws.Range(ws.Cells(행번호, 1), ws.Cells(행번호, 6)).Value[0]
    for 인덱스, 값 in enumerate(field_list):
        hwp.PutFieldText(값, text_list[인덱스])
    
    # 완성된 한 장의 문서를 PDF로 저장하는 코드

위의 코드를 실행하면

100개의 값이 차례대로 들어가는 것을 볼 수 있다.

다만, 위 스크립트는 아직 중요한 부분이 하나 빠져 있는데, 한 장의 문서가 백 번 바뀌어버렸다.

지난 포스팅에서 이야기했듯, 여기서 여러분은 두 가지 옵션 중 하나를 선택할 수 있다.
하나는, 한 장을 완성한 시점에 PDF문서를 하나 저장하는 과정을 백 번 하든지,
다른 하나는 문서를 한 장 더(혹은 한 번에 백장을) 만들고 각 페이지에 text_list를 집어넣는 방법이다.

둘 다 간단한데, 다음 포스팅에서는 이 두 가지 방법을 모두 다뤄보겠다.

이번 포스팅은 여기까지.

쓰다 보니 필자가 굉장히.....
의식의 흐름대로 글을 휘갈기고 있다는 느낌이 든다...
하지만 전체 흐름을 보면 간단하다.
1. 한/글 문서에 필드를 만들고,
2. 엑셀에서 필드에 들어갈 문자열을 불러와서,
3. 각각의 필드에 값을 대입한다.
4. 페이지를 추가해서 100장짜리 hwp문서를 만들거나,
   혹은 한 장짜리 한/글 문서를 계속 재활용해서 PDF를 출력한다. (4번 과정을 다음 포스팅에서 다룰 예정)

 

긴 글 읽어주셔서 감사드린다.

 


 

다음 포스팅은...

 

[교육업무자동화4/10] 청구서자동화4(청구서 마무리하기)

지난 포스팅은... [교육업무자동화3/10] 청구서자동화3(파이썬으로 엑셀 열어서 값 얻기) 지난 포스팅은... [교육업무자동화2/10] 청구서자동화2(필드에 텍스트 자동입력) 지난 포스팅은... [교육업

www.martinii.fun

 

댓글