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이라는 폴더가 만들어진 것을 알 수 있습니다.
그렇게 그대로 넣기만 한다면.....
이런 문제가 생기네요. 얘가 앞서 언급한 폴더 구분이 안된다는 예시입니다.ㅋㅋㅋㅋㅋㅋㅋ
코드를 잘 살펴보고 폴더 위치 값이 항상 '/'로 구분되게 해 놓으면 문제가 해결 될 거에요(아마도)ㅋㅋㅋㅋㅋ
그렇게 최종 코드는
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)
이렇게 된답니다!
'코딩 프로젝트 > 파이썬-한글 매크로 프로그램 제작' 카테고리의 다른 글
파이썬 한글 매크로 프로그램 제작 (feat. ChatGPT) - 9. 한글 공문 매크로 프로그램 (프로그램 첨부) (0) | 2025.03.02 |
---|---|
파이썬 한글 매크로 프로그램 제작 (feat. ChatGPT) - 8. 공문명 입력하기 (0) | 2025.03.02 |
파이썬 한글 매크로 프로그램 제작 (feat. ChatGPT) - 6. 실행 파일 변환 (0) | 2025.03.01 |
파이썬 한글 매크로 프로그램 제작 (feat. ChatGPT) - 5. 코드 합치기 (0) | 2025.03.01 |
파이썬 한글 매크로 프로그램 제작 (feat. ChatGPT) - 4. 한글 문서 pdf로 추출하기 (0) | 2025.02.25 |