2025.03.01 - [파이썬 업무 자동화/한글 문서 작업 자동화] - 파이썬 한글 매크로 프로그램 제작 (feat. ChatGPT) - 6. 실행 파일 변환

 

파이썬 한글 매크로 프로그램 제작 (feat. ChatGPT) - 6. 실행 파일 변환

2025.03.01 - [파이썬 업무 자동화/한글 문서 작업 자동화] - 파이썬 한글 매크로 프로그램 제작 (feat. ChatGPT) - 5. 코드 합치기 파이썬 한글 매크로 프로그램 제작 (feat. ChatGPT) - 5. 코드 합치기2025.02.25

sunnysides.tistory.com

우리는 앞선 게시글들에서 파일이 저장된 위치를 고정값으로 입력하여 사용하는 법을 익혔습니다. 근데 우리는 배포를 생각해야하죠? 그렇다면 고정 위치를 코드에 넣어둔다면 얘가 정신을 못 차릴 수밖에 없습니다.

매번 새로 입력해줄 수도 있겠지만 그렇다면 실행파일 하나만 배포하는 의미가 없겠죠?

이번 글에서는 파일 위치가 바껴도 작업을 진행할 수 있게 바꿔보도록 하겠습니다.

현재 폴더 위치 적용

대신 프로그램과 데이터 파일이 같은 폴더에 있게 해야 합니다. 마냥 전체 컴퓨터를 뒤져서 찾기는 쉽지 않겠죠??

코딩으로 들어가기 전에 과정을 먼저 생각해보도록 하겠습니다.

1. 현재 프로그램이 있는 위치 받아오기

2. 현재 위치에서 데이터 파일 가져오기

3. 데이터 읽어오기

4. 출력 파일 저장하기

 

1, 2번 과정은 코드에서 알아서 진행하게 될 것 같고,

3번 과정에서는 한글 양식에 집어넣을 데이터가 몇 종류인지 받아오는 과정이 추가되면 좋을 것 같고,

4번 과정에서는 출력파일이 저장될 폴더가 하위 폴더로 생성되면 좋을 것 같죠?

위 내용들을 차근차근 추가해보도록 하겠습니다.

 

 

xl_path = r'D:/한글 양식 자동화/'
xl_file = r'회사이름.xlsx'
hwp_path = r'D:/한글 양식 자동화/'
hwp_file = r'양식.hwp'
pdf_path = r'D:/한글 양식 자동화/ddd/'
pdf_file = r'양식.pdf'

company_list = getCompanyNames(xl_path,xl_file)

for company in company_list:
	getPDFfromBodyChange(hwp_path,hwp_file,pdf_path,company)

지난 코드에서 xl_path, hwp_path는 우리 프로그램과 같은 위치에 있을 테니 프로그램이 위치한 현재 폴더를 가져오는 함수가 있으면 좋겠죠?

 

파이썬에서는 한 줄이면 됩니다!!!..정확히는 두 줄....ㅋㅋㅋㅋ

import os
current_dir = os.path.dirname(__file__)

# print(current_dir)

요렇게 하면 현재 위치가 저장된 current_dir이라는 변수가 생성됩니다!

직접 확인하고 싶으면 print함수를 쓰면 된다고 말씀드렸죠?!

 

다음으로,

현재 폴더에서 엑셀 파일과 한글 양식을 찾아보도록 하겠습니다.

우리 폴더에는 '프로그램, 한글, 엑셀' 총 세 개만 들어있습니다. 그렇다면 확장자가 xlsx면 엑셀 파일, hwp면 한글 파일이 되겠죠?

1. 현재 폴더 찾기
2. 현재 폴더에 들어있는 것들 목록 구하기
3. 한글 파일, 엑셀 파일 갖고오기

순서로 진행하면 될 것 같습니다.

2번에서 파일 목록을 쭈루룩 뒤져서 3번에서 각각 변수에 저장하면 될 것 같죠?

file_list = os.listdir()

listdir이라는 함수를 사용하면 하위 폴더나 파일 목록을 모두 갖고올 수 있습니다.

이제 이 목록에서 확장자에 따라 기존에 있던 hwp_file과 xl_file 변수에 저장해보도록 하겠습니다.

for file in file_list:
    if '.xlsx' in file:
        xl_file = file
    
    elif '.hwp' in file:
        hwp_file = file

전체 file_list에 들어있는 file에 대해 각각의 조건이 맞으면 xl_file, hwp_file이라는 변수에 해당되는 값을 집어 넣는 조건문이 추가된 구조입니다.

같은 확장자가 여러 개면 마지막 값으로 덮어씌기가 되겠죠? 그래서 해당되는 값이 하나씩만 있어야 하는 게 중요하답니다. 그렇게 구한 위치와 파일명을 기존에 만든 함수에 각각 넣어주면 데이터 읽어오기까지 끝낼 수 있답니다.

 

4번 저장하기는,

파일이 중구난방으로 저장되면 정신 사납겠죠? 일단 현재 폴더에서 'output'이라는 하위 폴더에 출력 파일을 저장하도록 해봅시다. 그러려면 일단 폴더가 있어야 겠죠?

if 'output' not in file_list:
    os.mkdir(current_dir+r'\output')
    # os.mkdir(current_dir+'\\output')

혹시나 같은 이름의 폴더가 있으면 문제가 생길 수 있으므로, output이라는 폴더가 없을 경우에만 새로 만들어주는 코드를 추가했습니다. current_dir 바로 뒤에 output이라는 위치를 붙이면 폴더가 구분이 되지 않고 이름이 이어 붙기 때문에 \ 문자로 구분을 꼭 해줘야 한답니다.

여기서 '\' 문자의 특성 때문에 여러가지 방법이 가능하답니다. 자세한 건 파이썬 '문자열'을 공부하시면 된답니다.

그런데 사실 '/' 문자를 써도 돼요. 저는 얘를 선호해요ㅋㅋㅋ

 

이제 마지막으로 pdf 파일 이름만 설정하면 끝입니다!

pdf_file 변수는 hwp_file 이름과 똑같은데 확장자만 다르죠??

여러 가지 방법이 있겠지만, 단순하게 생각하면 문자열에서 문자만 바꾸는 식으로 하겠습니다.

pdf_file = hwp_file.replace('.hwp','.pdf')

한 줄이면 끝난답니다!

 

종합해서 함수로 만들면 깔끔하겠죠?

def getFiles():
    import os
    
    current_dir = os.path.dirname(__file__)
    file_list   = os.listdir(current_dir)
    
    for file in file_list:
        if '.xlsx' in file:
            xl_file = file
            
        elif '.hwp' in file:
            hwp_file = file
            pdf_file = file.replace('.hwp','.pdf')
            
    if 'output' not in file_list:
        os.mkdir(current_dir +'/output')
        
    pdf_path = current_dir +'/output'
    
    return current_dir, xl_file, hwp_file, pdf_file, pdf_path

folder,xl,hwp,pdf,pdf_folder = getFiles()

생각해보니 current_dir을 구했으니 굳이 xl_path와 hwp_path를 만들지 말고 그대로 사용하면 되겠더라구요. 그래서 걔네는 패쓰!!

이렇게 원래 폴더로 들어가면 output이라는 폴더가 만들어진 것을 알 수 있습니다.

그렇게 그대로 넣기만 한다면.....

그림 1. 이럴 수가

이런 문제가 생기네요. 얘가 앞서 언급한 폴더 구분이 안된다는 예시입니다.ㅋㅋㅋㅋㅋㅋㅋ

코드를 잘 살펴보고 폴더 위치 값이 항상 '/'로 구분되게 해 놓으면 문제가 해결 될 거에요(아마도)ㅋㅋㅋㅋㅋ

그렇게 최종 코드는

def getFiles():
    import os
    
    current_dir = os.path.dirname(__file__)
    file_list   = os.listdir(current_dir)
    
    for file in file_list:
        if '.xlsx' in file:
            xl_file = file
            
        elif '.hwp' in file:
            hwp_file = file
            pdf_file = file.replace('.hwp','.pdf')
            
    if 'output' not in file_list:
        os.mkdir(current_dir +'/output')
        
    pdf_path = current_dir +'/output/'
    
    return current_dir+'/', xl_file, hwp_file, pdf_file, pdf_path



def getCompanyNames(xl_path,xl_file):
    from openpyxl import load_workbook
    
    file_path  = xl_path + xl_file
    wb         = load_workbook(file_path) 
    ws         = wb.active 
    total_rows = sum(1 for row in ws["B"] if row.value is not None)
    
    
    company_list = []
    for i in range(total_rows-1):
        company_list += [ws['B%s'%(i+2)].value]
    
    return company_list



def getPDFfromBodyChange(hwp_path,hwp_file,pdf_path,company_name):
    import win32com.client as win32
    
    hwp = win32.Dispatch("HWPFrame.HwpObject")
    hwp.XHwpWindows.Item(0).Visible = True
    
    file_path  = hwp_path+hwp_file
    pdf_path1  = pdf_path+'%s.pdf'%(company_name)
    
    hwp.Open(file_path,'HWP','forceopen:true')
    hwp.PutFieldText("field",r' 까꿍')
    hwp.SetMessageBoxMode(0x1000)
    hwp.SaveAs(pdf_path+'%s.hwp'%(company_name),'HWP','')
    
    action = hwp.CreateAction("Print")
    option = action.CreateSet()
    
    action.GetDefault(option)
    option.SetItem("Device", 3)
    option.SetItem("FileName", pdf_path1)
    action.Execute(option)
    hwp.Quit()
    
    return



current_folder,xl,hwp,pdf,pdf_folder = getFiles()

company_list = getCompanyNames(current_folder,xl)

for company in company_list:
	getPDFfromBodyChange(current_folder,hwp,pdf_folder,company)

이렇게 된답니다!

2025.02.25 - [파이썬 업무 자동화/한글 문서 작업 자동화] - 파이썬 한글 문서 매크로 제작기 (feat. ChatGPT) - 3. 회사명 갖고 오기

 

파이썬 한글 문서 매크로 제작기 (feat. ChatGPT) - 3. 회사명 갖고 오기

2025.02.23 - [파이썬 업무 자동화/한글 문서 작업 자동화] - 파이썬 한글 문서 매크로 제작기 - 2. 내용 바꾸기 파이썬 한글 문서 매크로 제작기 - 2. 내용 바꾸기2025.02.23 - [파이썬 업무 자동화/한글

sunnysides.tistory.com

이번 글에서는

한글 문서 pdf로 뽑아내기

를 해 보도록 하겠습니다.

뭔가 시작은 어려웠는데 정리하다 보니 왜 이렇게 쉬운 내용을 어려워했지 싶네요. 세상 만사 마음 먹기 나름이라는 옛말은 어디든지 해당되는 것 같네요ㅋㅋㅋ

그림 1. 이젠 익숙해진 지피티
그림 2. 엥 형이 왜 떠?

하.. 다시 문제가 생겼습니다. 자꾸 물어봐도 똑같은 대답 밖에 안 나오네요..

이렇게 '세계적으로(?) 유명하지 않은' + '내가 지금 필요한' 작업은 꼭 에러가 뜨더라구요. 하지만 걱정 마세요. 우리에겐 구글신이 있으니까...ㅋㅋㅋ

야매로 코드 짜깁기를 하던 우리는 도저히 각 함수들이 뭘 의미하는지 알 수 없습니다. 찾아보고 싶지도 않고, 찾았다고 알아먹을 수 있지도 않아요. 그럴 때는 항상 처음 사용한 라이브러리를 '뒤져본다'고 생각하시면 된답니다~

열심히 'win32com' 'hwpframe' 같은 걸 검색해본 결과(막무가내로 검색해서 어떻게 찾았는지 기억도 안 나네요ㅋㅋㅋ) 천재 한컴 개발자분들이 우리가 쓰던 라이브러리를 만들었다는 사실을 알아냈습니다.

https://store.hancom.com/board/devmanualList.do?

 

글로벌 소프트웨어의 리더, 한글과컴퓨터

 

store.hancom.com

여기에 우리가 사용할 만한 내용이 다 정리가 되어 있습니다!!!!

하지만 쓸 줄 모르죠?ㅋㅋㅋㅋㅋㅋㅋ

그림 3. 찾았다 인쇄..

문서를 뒤져서 프린트를 해 줄 것 같은 놈을 찾았습니다.

그림 4. 왜 pdf로 저장은 따로 있어..

겨우겨우 Action ID 가 Print이고, Item ID에서 PIT_UT1 Type의 3번이 pdf 파일로 저장인 것을 알았습니다. 찾았죠? 이제 다 끝났다고 보시면 됩니다. 오평파(이썬).

그림 5. 그렇구나.

뭔가 사용할 수 있을 줄 알았는데, 너무 어려웡.. 그렇다면!!

그림 6. 주워들은 거 조합해서 물어보기

답은 있어보이게 물어보기 신공입니다. 휴 역시 해결.

이렇게 챗지피티를 쓸 때도 필요한 요소를 대략적으로라도 찾아서 물어보면 해결의 실마리가 보인답니다...였습니다만...

 

그림 7. 이 새..친구는 머야...

하..............................에러 문구는 안 뜨고 저장도 잘 되는데 pdf 출력이 안 됩니다..........스트레스 받네요...

그림 8. 아니 드라이버 설치라니 한글 pdf 추출에 드라이버를 설치한 적이 없는데..

우리 친구가 의미 없는 대답만 반복하는 와중에, 답을 겨우 찾았습니다.

 

그림 9. 기본 설정은 분명 Microsoft PDF로 돼 있는데...

ㅋㅋㅋㅋㅋㅋㅋㅋ하.. 기본 설정은 분명 돼 있는데,,

그림 10. PDF 저장이 기본 옵션이네?!

제가 코드를 볼 때 분명 'Microsoft PDF 어쩌구'가 들어간 코드가 있고, SetItem("Device","3")으로 돼 있는 코드가 있었거든요. 그래서 왠~~~~~~~~지 그림 4에 있던 3번이 기본 설정에 있는 "PDF 저장" 얘인가 싶어서 눌렀더니

그림 11. 떄앰~

얘가 인쇄 버튼이 비활성화 되길래 더블클릭했더니 이렇게 뜨더라구요.. 이런 건 처음 봤다....

그림 12. 신기한 설정창..
그림 13. 해결따리~~

그렇게 따라했더니 해결!!! 휴.. 매우 기분이 좋아졌습니다.

그렇게 최종 코드는

import win32com.client as win32


hwp = win32.Dispatch("HWPFrame.HwpObject")
hwp.XHwpWindows.Item(0).Visible = True  # 한글 창 보이기

file_path = "D:/한글 양식 자동화/양식.hwp"
pdf_path = "D:/한글 양식 자동화/tmp/양식.pdf"
hwp.Open(file_path, "","")

# 🔹 ③ 한글의 메시지 박스 모드 변경 (저장 시 창 뜨지 않도록)
hwp.SetMessageBoxMode(0x1000)

# 🔹 ② 인쇄 설정 값 가져오기
action = hwp.CreateAction("Print")
option = action.CreateSet()

# 🔹 ② PDF 저장을 위한 인쇄 설정
# hwp.HAction.Run("Print")  # 인쇄 창 직접 실행

action.GetDefault(option)  # 기본 인쇄 설정 불러오기

# 🔹 ③ 'Device'를 PDF로 변경 (3번 설정)
option.SetItem("Device", 3)

# 🔹 ④ PDF 파일명 설정
option.SetItem("FileName", pdf_path)

# 🔹 ⑤ 설정 적용 후 인쇄 실행
action.Execute(option)

# 한글 종료
hwp.Quit()

이렇게 나왔답니다^^

중간에 뜬금 없는 '메시지 박스 모드'가 생겼는데, 얘는 있든 없든 차이가 없던데, 뭔가 우리의 똑똑이 친구가 가르쳐 주기로는 같은 이름 파일이 있어도 자동으로 덮어쓰게 해주는 설정이라네요. 제 기준에서는 없어도 잘 덮어지긴 하던데 혹시나 싶어 놔뒀답니다.

 

드디어 끝이 보이는 것 같네요. 이제 지금까지 했던 코드를 조합해서 하나의 코드로 합체시키고, 하나의 프로그램으로 만든다면 좀 더 까리한(!) 프로젝트가 될 것 같습니다.ㅋㅋㅋ

2025.02.23 - [파이썬 업무 자동화/한글 문서 작업 자동화] - 파이썬 한글 문서 매크로 제작기 - 2. 내용 바꾸기

 

파이썬 한글 문서 매크로 제작기 - 2. 내용 바꾸기

2025.02.23 - [파이썬 업무 자동화/한글 문서 작업 자동화] - 파이썬 한글 문서 매크로 제작기 - 1. 개발 환경 설정(1) 파이썬 한글 문서 매크로 제작기 - 1. 개발 환경 설정(1)뭔가를 시작하는 일은 막

sunnysides.tistory.com

 

처음부터 차근차근 읽지 말고 쭉 훑어보고 필요한 부분만 찬찬히(?) 읽어 보시길 추천드립니다.

 

2편에 이어 3편은 엑셀로 갖고 있는 회사명을 코드로 갖고 오는 과정입니다.

회사 목록 엑셀 파일을 파이썬 코드로 갖고 오기

 

지난 번 말씀 드렸듯, 코딩은 언제나 알고리즘이 우선입니다. 항상 '어떻게 해야 멍청한 컴퓨터가 내가 하는 작업을 잘 알아들을까?'라는 고민을 먼저 한 후에 코딩을 시작해야 효율이 좋아지기 마련이죠.

 

 이번 프로젝트는 한글 문서 양식에서 회사명을 바꿔가며 서로 다른 이름의 pdf 파일로 저장하고, 메일로 보내는 작업까지 진행할 예정입니다.

 

일단 시작하기에 앞서 아주아주 기초적인 사용법은 익혔기 때문에, 약간의 마음의 여유를 갖고 알고리즘을 고민할 시기가 왔습니다.

 

우리는 한글 문서 양식과 엑셀 회사명 목록을 갖고 있고, 알고리즘을 생각하면

1. 엑셀 파일을 열어 회사 목록을 가져온다.

2. 한글 파일을 열어 앞서 구한 회사명을 입력한다.

3. 수정된 한글 파일을 pdf로 저장한다.

4. pdf 파일을 메일로 첨부해서 보낸다.

 

이런 순서가 될 것 같죠?

 

우리는 1편과 2편에서 위 목록의 2번 한글 파일을 다루는 방법을 익혔습니다. 왜냐하면 1번은 쉽기 때문이죠.(진지)

 

ㅋㅋㅋ1번이 쉬운 이유는 엑셀은 무려 세계적인 프로그램(!)이기 떄문이죠... 아래한글은 우리나라만 쓰는데.... 그러면서 범용성도 꾸진......쿨럭

 

아무튼 다시 본론으로 돌아가서, 회사명이 들어 있는 엑셀 파일을 먼저 살펴봅시다.

그림 1. 회사명.xlsx

 

엑셀은 다들 아시다시피 파일 안에 여러 시트가 들어있는 구조로 되어 있습니다. 파이썬은 화면을 바로 클릭할 수 없기 때문에 시트 정보를 이용해 내용을 처리해야 한답니다.

 

그 다음은 언제나처럼 우리의 구세주(제발)가 되어주던 챗지피티!

그림 2. 엑셀 지피티
그림 3. 엑셀 지피티 2

openpyxl 또는 pandas를 쓰라네요. 우리는 둘 다 모르니 뭔가 있어 보이는 openpyxl을 쓰도록 하겠습니다.

from openpyxl import load_workbook

# 🔹 ① 엑셀 파일 열기
file_path = r"D:/한글 양식 자동화/회사이름.xlsx"
wb = load_workbook(file_path)  # 엑셀 파일 로드
ws = wb.active  # 기본 활성화된 시트 선택

# 🔹 ② 특정 셀 값 읽기 (A1 셀)
print(ws["A1"].value)  # 첫 번째 셀 값 출력

# # 🔹 ③ 특정 셀 값 변경 후 저장
# ws["A1"] = "새로운 값"
# wb.save(r"C:\경로\새로운_파일.xlsx")

응용을 위해 한 줄 단위로 사용해 보겠습니다. 일단 값을 읽고, 다른 값으로 바꿔서 저장하는 코드를 준 것 같은데, 우리는 여러 개 값을 읽어오는 게 목표기 때문에 일단 저장하는 부분은 주석 처리 후 하나만 읽어 보겠습니다.

그림 4. 짜잔

ws["A1"].value를 하면 A1 값이 보이네요. 먼저 데이터가 총 몇 행인지 알아봅시다.

그림 6. 얘로 간다

사실 총 세 가지를 주던데, '회사명' 열에 있는 데이터만 확인하고 가져오면 되겠죠? 고로 두 번째 방식으로 가겠습니다.

from openpyxl import load_workbook

# 🔹 ① 엑셀 파일 열기
file_path = r"D:/한글 양식 자동화/회사이름.xlsx"
wb = load_workbook(file_path)  # 엑셀 파일 로드
ws = wb.active  # 기본 활성화된 시트 선택

# 🔹 ② 특정 셀 값 읽기 (A1 셀)
print(ws["A1"].value)  # 첫 번째 셀 값 출력
# len(ws)

total_rows = sum(1 for row in ws["B"] if row.value is not None)
print(f"A열의 데이터 개수: {total_rows}줄")

# # 🔹 ③ 특정 셀 값 변경 후 저장
# ws["A1"] = "새로운 값"
# wb.save(r"C:\경로\새로운_파일.xlsx")

저장을 하는 건 결국 마지막 단계일 테니 중간에 끼워 넣겠습니다.

그림 7. 오 된다

우린 데이터가 총 4개 여야 하는데, 5줄이라 나오죠? 첫 줄도 포함하는가 보네...하면서 야매로 -1을 해줍시다.

from openpyxl import load_workbook

# 🔹 ① 엑셀 파일 열기
file_path = r"D:/한글 양식 자동화/회사이름.xlsx"
wb = load_workbook(file_path)  # 엑셀 파일 로드
ws = wb.active  # 기본 활성화된 시트 선택

# 🔹 ② 특정 셀 값 읽기 (A1 셀)
print(ws["A1"].value)  # 첫 번째 셀 값 출력
# len(ws)

total_rows = sum(1 for row in ws["B"] if row.value is not None)
print(f"A열의 데이터 개수: {total_rows-1}줄")

# # 🔹 ③ 특정 셀 값 변경 후 저장
# ws["A1"] = "새로운 값"
# wb.save(r"C:\경로\새로운_파일.xlsx")

뭔가 바꼇습니다. 대충 total_rows에 1을 빼면 되니 그 자리에 일단 넣어봤더니 되는군요. 굳

그림 8. 야매로 갯수 맞추기

다음으로 넘어가기 전에 python의 기초적인 반복문을 알아보겠습니다. 파이썬에서 반복문은 for라는 놈을 쓴다고 생각하시면 됩니다. for 구문은

for (변수 이름) in (변수 범위):
(반복할 내용)

의 구조로 이뤄져 있습니다.

변수 이름은 보통 몇 번째인지를 index라고 해서 i 라 하고, 밑의 양식을 따른답니다.

company_list = []

for i in range(total_rows-1):
    company_list += [ws['B%s'%(i+2)].value]
    # company_list += [ws['B'+str(i+2)].value]

요기서 뜬금 없이 등장한 %는 파이썬에서 글자에 임의의 변수를 넣는 방식이랍니다. 바로 밑의 주석 처리 된 부분과 같은 의미에요. 요기는 파이썬 문법이기 때문에 이번 글에서는 넘어가도록 하겠습니다..만 간단하게 설명하자면,

1. 빈 리스트 만들기
2. 총 데이터 행 수만큼 반복하기
3. 앞서 만든 리스트에 B(숫자) 위치의 데이터 추가하기

순서로 이뤄진 코드랍니다. 자세한 사용법(?)이 궁금하신 분들은 파이썬 기본 문법을 익히시면 된답니다. 저는 위키독스를 스승님으로 모시고 있...ㅋㅋㅋ

https://wikidocs.net/book/1

 

점프 투 파이썬

이 책은 파이썬이란 언어를 처음 접해보는 독자들과 프로그래밍을 한 번도 해 본적이 없는 사람들을 대상으로 한다. 프로그래밍을 할 때 사용되는 전문적인 용어들을 알기 쉽게 풀어서 …

wikidocs.net

책 사세요 여러분. 제 책은 아닙니다... 제 마음 속 스승님께 커피 한 잔이라도...

사실 '파이썬 % 뜻' 이렇게 검색해도 나온답니다ㅋㅋㅋ

아무튼 위의 코드를 조합하면

그림 9. 변수 리스트가 만들어졌다!

이렇게 데이터를 쫘라락 뽑을 수 있습니다!!

from openpyxl import load_workbook

# 🔹 ① 엑셀 파일 열기
file_path = r"D:/한글 양식 자동화/회사이름.xlsx"
wb = load_workbook(file_path)  # 엑셀 파일 로드
ws = wb.active  # 기본 활성화된 시트 선택

# 🔹 ② 특정 셀 값 읽기 (A1 셀)
# print(ws["A1"].value)  # 첫 번째 셀 값 출력
# len(ws)

total_rows = sum(1 for row in ws["B"] if row.value is not None)
# print(f"A열의 데이터 개수: {total_rows-1}줄")

company_list = []

for i in range(total_rows-1):
    company_list += [ws['B%s'%(i+2)].value]
    
    # company_list += [ws['B'+str(i+2)].value]
    


# # 🔹 ③ 특정 셀 값 변경 후 저장
# ws["A1"] = "새로운 값"
# wb.save(r"C:\경로\새로운_파일.xlsx")

정리하자면 이렇게 간단한(?) 코드가 완성된답니다.

주석 처리된 부분은 전부 지워도 되기 때문에 사실은 엄청 간단한 코드가 된다는 것~

2025.02.23 - [파이썬 업무 자동화/한글 문서 작업 자동화] - 파이썬 한글 문서 매크로 제작기 - 1. 개발 환경 설정(1)

 

파이썬 한글 문서 매크로 제작기 - 1. 개발 환경 설정(1)

뭔가를 시작하는 일은 막연히 '~~~를 해야지!'라는 마음으로 첫 발이 떼지지 않네요. 구체적으로 어떤 걸 만들고 싶다는 주제가 있어야 시작할 수 있는 느낌이랄까..?  그런 의미에서! 노가다..!

sunnysides.tistory.com

 

 차근차근 따라하기보다 와랄라 읽어 보고 필요한 부분만 살펴보시는 걸 추천드립니다.ㅋㅋㅋ

 

 이전에 파이썬으로 한글 문서를 다루는 라이브러리 설치와 문서를 여는 법을 익혔습니다.

 다 우리의 똑똑한 친구 챗지피티와 구글신 덕분인데 염치가 없나 봅니다만 이왕 쓰는 거 끝까지 가보도록 하겠습니다..

 

import win32com.client as win32

# 한컴 한글 실행
hwp = win32.Dispatch("HWPFrame.HwpObject")
hwp.XHwpWindows.Item(0).Visible = True  # 한글 창 보이기

# 기존 문서 열기
file_path = r"파:/일/경/로/파일명.hwp"
hwp.Open(file_path,'HWP','forceopen:true')

 

 겨우 이거 하느라 시간이 한참 걸렸네요.

 

 제가 코딩을 잘하는 편은 아니지만, 코딩에서 코드를 짜는 것보다 중요한 건 어떤 작업을 할 지 고민하는 것입니다. 알고리즘을 짠다고 하죠.

 

 우리의 목적은 코딩을 공부한다기보다 프로젝트를 만드는 것이니까요. 우리는 똑똑한 사람들이 짜 놓은 코드를 베끼기만..(?) 하는 것입니다!(당당)

 

 그런 의미에서, 이번 포스팅의 목표는

 한글 문서 양식의 본문 수정

 

입니다.

 

사실 지난 번 우리의 친구 챗지피티한테 표 내용을 바꾸는 법을 물어봤죠.

그림 1. 챗지피티 재탕1
그림 2. 챗지피티 재탕2

 

지난 1탄에서 우리는 기존 문서 여는 방법은 익혔기 때문에, 추가 수정이 필요했습니다.

그림 3. 수정된 코드.

 

그런데, 표 수정은 커녕 커서가 이동하지도 않더라구요..

그림 4. 에러 코드.

 

도와줘 챗지피티!

그림 5. 똑똑한 건지 멍청한 건지..

 

수정된 코드를 써도 다시 문제가 생겼습니다. 지난 번의 악몽... 질문이 도돌이표가 돼 버리니 따로 해결해 봅시다.

 

이럴 땐 차근차근 문제가 어디서 생겼는 지 확인할 필요가 있습니다.

 

import win32com.client as win32

# 한컴 한글 실행
hwp = win32.Dispatch("HWPFrame.HwpObject")
hwp.XHwpWindows.Item(0).Visible = True  # 한글 창 보이기

# 기존 문서 열기
file_path = r"D:/한글 양식 자동화/양식.hwp"
hwp.Open(file_path,'HWP','forceopen:true')

 

일단 요까지는 잘 굴러가는 걸 확인했습니다.

 

그렇다면 표 안의 내용을 변경하기 앞서, 원하는 지시(커서를 이동하고 표를 선택하는 것)가 제대로 이행되는지 살펴봐야 합니다.

# 커서를 문서의 처음으로 이동 (표 찾기 전에 안전한 위치로 이동)
hwp.HAction.Run("MoveTopLevelBegin")

# 첫 번째 표 선택
hwp.HAction.Run("TableCellBlock")  # 표 내부 선택
hwp.HAction.Run("TableSelect")  # 표 전체 선택

# 커서를 첫 번째 셀로 이동
hwp.HAction.Run("TableCellBlock")  # 다시 표 내부 선택
hwp.HAction.Run("TableLeftCell")  # 왼쪽 상단 셀 선택

# 텍스트 입력
# hwp.InsertText(r"hihihi")

# # 새로운 파일 이름으로 저장
# new_file_path = r"C:\경로\새로운_파일명.hwp"
# hwp.SaveAs(new_file_path, "HWP")

# # 한컴 한글 종료
# hwp.Quit()

 

파이썬에서 #이 붙는 건 해당 줄을 없는 셈 치겠다(주석 처리)는 의미입니다.

 

시킨 대로 커서가 잘 이동하는지 보기 위해 뒷 부분을 전부 날렸습니다.

 

그림 6. 아니 커서가 왜 그대로야.

 

이럴 수가.. 커서가 이동하지 않습니다. 이렇다면 우리는 이렇게 어려운 방식을 버려야 합니다. 왜냐하면 우리는 HAction이라는 명령어를 어떻게 쓸 수 있는지, 문서를 어디서 찾아야 하는지 같은 고급 기술을 익히기엔 시간이 부족합니다. 빨리 놀러 나가야 합니다.

 

그림 7. 구관이 명관.

 

구글로 돌아왔습니다. 더 개꿀 빠는 방법을 가르쳐 달란 말이야!

 

라는 열망에 찾았습니다.

호다닥 프로젝트를 달성하고 싶은 분들이 아닌 진득하게 자세한 사용법을 익히고 싶은 분은 요기로 가시면 됩니다.

https://wikidocs.net/257896

 

01-3 텍스트 입력

이번 챕터에서는 본격적으로 문서에 텍스트입력을 해 보겠습니다. 먼저 터미널에서 `jupyter notebook` 명령어로 주피터노트북을 실행한 후, 아래 코드 두 줄을 실행…

wikidocs.net

와 갓일코.. 일갓... 일코님 고맙습니다. 

저보다 뛰어난 분이 계십니다. 여러분 여기로 보러 가세요. 제 글보다 좋습니다. 저도 여기서 배웠습니다.

 

한글에는 누름틀이라는 기능이 있군요. 처음 알았습니다.

 

각설하고, 이번 포스팅의 목표로 다시 돌아오겠습니다.

 한글 문서 양식의 본문 수정 (데자뷰 아님)

그림 8. 누름틀 필드 입력 창

 

한글 문서에서 원하는 곳에 커서를 두고 컨트롤+k+e를 누르면 요런 창이 뜹니다. 순서대로 눌러도 되네요.

 

적는 게 많아서 뭐가 뭔지 헷갈립니다. 그냥 순서대로 호잇,테스트,field라고 구분할 수 있게 다른 값으로 넣었어요. 필드 이름을 코드에서 입력하는데, 호옥시나 한글을 못 인식할까봐 영어로 적었습니다.

그림 9. 짜잔

 

예시로 적히는 글이 안내문이고, 필드 이름이 field로 설정이 되나 봅니다. 메모 내용은 뭐지.. 쓸 일 없으니 패쓰~

 

그림 10. 누름틀 내용란

생성된 누름틀을 클릭하면 빈 칸으로 변하고 한글 창 맨 밑에 보면 (B1): 필드 [field]라고 필드 이름이 나오네요.

다시 코드로 돌아가보겠습니다

그림 11. 오 바꾸기 성공

 

휴 이번엔 진짜 성공했습니다. 수신자를 바꾸고 싶은데, 성공적으로 까꿍으로 바꿨네요.

 

import win32com.client as win32

hwp = win32.Dispatch("HWPFrame.HwpObject")
hwp.XHwpWindows.Item(0).Visible = True  # 한글 창 보이기 (필요 시 False로 설정)


file_path = r"D:/한글 양식 자동화/양식.hwp"
hwp.Open(file_path,'HWP','forceopen:true')

hwp.PutFieldText("field",r' 까꿍')
# hwp.PutFieldText("field1",r' 까꿍')

 

 여러 영역의 글자를 바꾸고 싶으면 누름틀을 추가하시고, 필드 이름을 field1, field2 이런 식으로 추가해서 마지막 줄과 같이 수정하시면 됩니다.

 

 본문에서는 field라는 누름틀 하나만 만들었지만 원하시면 field1이라는 이름을 가진 누름틀을 새로 만들고, 맨 밑에 줄을 주석 해제 처리 하는 식으로~~~

 

 

 

다음엔 엑셀로 갖고 있는 회사명을 쭈루룩 집어넣는 방법을 적어보도록 하겠습니다.

+ Recent posts