지난 포스팅은...
지난 시간에는 파이썬으로 한/글 파일을 열고 누름틀 목록을 가져오거나, 누름틀에 값을 입력하는 방법을 알아보았다.
그 과정에서 파이썬의 기본자료형인 list와, 기초문법 중 하나인 for문, 그리고 enumerate 등을 사용해서
field_list와 text_list를 1:1로 매칭하여 대입하는 방법을 사용해보았다.
지난 과정이 이해되었다면, 이번 포스팅은 굉장히 단순하게 느껴질 것이다.
왜냐면, 엑셀파일을 열어서 한 개의 행을 파이썬의 text_list로 가져오는 게 전부이기 때문이다.
1. 파이썬으로 엑셀을 열자.
혹시라도 이 튜토리얼을 하나씩 따라하고 있을 독자분들의 귀찮음을 해소하기 위해
아래와 같이 예제용 엑셀파일을 만들어놓았으니, 활용해주기 바란다.
이전 포스팅에서는 아래 코드를 사용해 파이썬으로 한/글을 열었는데,
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이다.
사용법을 하나하나 설명하는 것보다는 아래의 예시를 보면 어느 정도 이해가 될 것이다.
셀주소를 이용한 더 심도있는 탐색법은 아래 포스팅을 참고하기 바람.
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를 한/글 필드에 삽입하는 코드
그러면 #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로 저장하는 코드
위의 코드를 실행하면
다만, 위 스크립트는 아직 중요한 부분이 하나 빠져 있는데, 한 장의 문서가 백 번 바뀌어버렸다.
지난 포스팅에서 이야기했듯, 여기서 여러분은 두 가지 옵션 중 하나를 선택할 수 있다.
하나는, 한 장을 완성한 시점에 PDF문서를 하나 저장하는 과정을 백 번 하든지,
다른 하나는 문서를 한 장 더(혹은 한 번에 백장을) 만들고 각 페이지에 text_list를 집어넣는 방법이다.
둘 다 간단한데, 다음 포스팅에서는 이 두 가지 방법을 모두 다뤄보겠다.
이번 포스팅은 여기까지.
쓰다 보니 필자가 굉장히.....
의식의 흐름대로 글을 휘갈기고 있다는 느낌이 든다...
하지만 전체 흐름을 보면 간단하다.
1. 한/글 문서에 필드를 만들고,
2. 엑셀에서 필드에 들어갈 문자열을 불러와서,
3. 각각의 필드에 값을 대입한다.
4. 페이지를 추가해서 100장짜리 hwp문서를 만들거나,
혹은 한 장짜리 한/글 문서를 계속 재활용해서 PDF를 출력한다. (4번 과정을 다음 포스팅에서 다룰 예정)
긴 글 읽어주셔서 감사드린다.
다음 포스팅은...
'아래아한글 자동화 > python+hwp 중급' 카테고리의 다른 글
[교육업무자동화4/7] 청구서자동화4(청구서 마무리하기) (0) | 2021.01.22 |
---|---|
커뮤니티질문 : GetText()에서 표, 글상자에서 텍스트 읽어오기? (0) | 2021.01.22 |
hwp.GetFieldList() # 필드를 다룰 때 꼭 알아야 하는 메서드 (0) | 2021.01.22 |
댓글