일코
@ilco
미들 (4~8년)·
SW 엔지니어
앤스랩
수강생
830
수강평
54
강의 평점
4.9
멘토링 신청
-
멘토링 리뷰
-
멘토링 평점
-
안녕하세요?
일상의코딩 블로그를 운영중인 일코입니다.
업무자동화와 관련한 콘텐츠 제작 및 강의 등을 하고 있습니다.
업무자동화 교재를 몇 권 읽고 난 후,
자기업무를 코딩으로 자동화할 때는
새롭고 생소한 난관에 거의 무조건 빠지게 될 겁니다.
실무의 세상은 너무 다양하고, 또 예측하기 힘드니까요.
그래서 멘토링이 필요한 때가 분명히 찾아온다고 생각합니다.
제한적인 교재나 영상의 한계에 갇히지 마시고
본인의 무한한 상상력을 코드로 옮길 수 있도록
생각의 장벽을 허물어드릴 수 있는
가치있는 코칭과 멘토링을 제공해드리겠습니다.
저는 파이썬-아래아한글 및 엑셀 자동화 7년차, 현재는 프리랜서이며
300여 건의 크고작은 자동화 프로젝트를 진행해 왔습니다.
특히 공공기관 행정업무나, 학교, 학원 등
아래아한글과 엑셀을 주로 다루는 분야에서
업무를 효율적이고 빠르게 처리하기 위한 프로그램을 주로 제작해 왔으며
최근에는 스마트스토어, 쿠팡윙스, 카카오쇼핑하기 등의 서비스에서
다양한 정보를 크롤링하고 자동으로 보고서를 제작하는 서비스를 제공하고 있습니다.
여러분이 당면한 문제에 대해
언제든 자유롭게 상담요청 해주시기 바랍니다.
저도 온 마음으로 여러분의 문제를 경청하고
미약하지만 제 수준에서 도움드릴 수 있는 부분을 찾아보겠습니다.
감사합니다.
강의
수강평
- 직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
- 직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
게시글
질문&답변
한글 표 내부 위치 찾는 코드좀 알려주세요 ㅠㅠ
pyhwpx 모듈을 사용하신다는 전제하에,문서의 첫 번째 표, 첫 번째 셀(A1)로 이동하는 명령어는hwp.get_into_nth_table(0) 입니다. (0은 생략 가능합니다.) (사진) 답변이 늦어 죄송합니다.도움이 되었길 바랍니다.행복한 하루 되세요!^^
- 1
- 2
- 61
질문&답변
본문을 각주로 내리는 법
호석님 안녕하세요?답변이 늦었습니다.질문 주신 내용에 대한 특정 챕터가 있지는 않습니다.본 답변에 최대한 구체적으로 설명을 드리고자 합니다.만약 이해가 잘 안 되는 부분이 있다면 추가질문 주시기 바랍니다.여러가지 방법이 생각나지만, 그래도 제가 가장 효율적이라고 생각하는 방법은"찾기"를 활용하는 것입니다. 단, 각주로 바꿀 구간의 마지막에만 닫는 괄호가 있어야 합니다.(이런 제한조건을 두지 않는다면 굉장히 많은 분량의 예외처리를 해야 하는데 그게 참 어렵습니다.)그리고, win32com 대신 이를 조금 보완한 파이썬 모듈인 pyhwpx 를 사용하겠습니다. 예시로,(사진)위와 같은 문서가 있을 때,"찾기" 기능을 통해 (출처: 를 찾으면 아래와 같이 선택이 됩니다. [아래 영상 참고](사진)이를 조금 응용하여, 조건식 사용을 활성화하고\(출처:.+\)를 찾으면 각주로 빼낼 구간을 전부 선택할 수 있습니다. 중간의 .+는 아무 글자들을 뜻하는 와일드카드 같은 정규식 문법입니다. [아래 영상 참고](사진) 그럼 해당 구간을 잘라낸 후, 각주삽입 명령 실행, 붙여넣기를 하면 해당 구간이 각주로 변경되고,결국 이를 while문으로 반복하기만 하면 됩니다. 아래 시연화면과 전체 예시코드를 보여드리겠습니다.(사진) 코드는 아래와 같습니다.from pyhwpx import Hwp hwp = Hwp() # hwp.open("편집할_파일경로.hwp") hwp.MoveDocBegin() # 문서 처음으로 이동 while hwp.find(r"\(출처:.+\)", regex=True): # 정규식 찾기(찾으면 True 리턴) 반복 endnote = hwp.GetTextFile("HWPML2X") # 각주로 바꿀 부분 추출 hwp.Delete() # 삭제 hwp.InsertFootnote() # 각주생성 hwp.SetTextFile(endnote) # 각주삽입 hwp.CloseEx() # 각주에서 빠져나오기 중간의 HWPML2X는, 특정 내용을 추출할 때 제가 애용하는 포맷(XML)의 문자열입니다. 도움이 되었길 바랍니다.행복한 하루 되세요^^
- 1
- 1
- 23
질문&답변
빈 문서를 새로 열때는 팝업이 안나오는데 기존 문서를 열면 팝업이 나옵니다
새 파일에는 원래 보안팝업이 뜨지 않습니다.아직 레지스트리등록이 정상적으로 되지 않은 것으로 보입니다. 다시 시도해주시기 바랍니다.혹은 가상환경 터미널에서 (pywin32 모듈을 설치했을 때와 동일하게)pip install pyhwpx 명령어로 pyhwpx 모듈을 설치하신 후에 from pyhwpx import Hwp hwp = Hwp()명령어로 아래아한글을 실행하시는 것도 한 가지 대안입니다. 참고해주시기 바랍니다.행복한 하루 되세요^^
- 1
- 2
- 42
질문&답변
한글 자동화 삽도 삽입!!
ㅇㅇㅇㅇ님! 메일로 코드 송부드렸습니다. 확인 부탁드립니다.행복한 하루 되세요!!!
- 1
- 2
- 85
질문&답변
특정 스타일을 찾아 이동하는 방법
pyhwpx 모듈 안에 hwp.goto_style(스타일이름) 메서드를 추가해 두었습니다.사용방법은 아래와 같습니다. 한글 문서를 열어 둔 상태에서 실행하시면 됩니다.아래 코드는 문서 전체에서 "개요 1" 스타일만 모두 찾아다니면서끝에 " :"을 붙이는 코드입니다.from pyhwpx import Hwp hwp = Hwp() hwp.MoveDocBegin() while hwp.goto_style("개요 1"): hwp.MoveParaEnd() hwp.insert_text(" :")(사진)도움이 되었길 바랍니다^^
- 1
- 2
- 55
질문&답변
현재 커서 문단에 아무런 내용이 없는지 확인하기
안녕하세요!pyhwpx 라이브러리에 hwp.is_empty_para()라는 메서드가 있습니다. 빈 문단인 경우 True를 리턴합니다.사용방법은, 해당 한/글 파일을 열어놓은 상태에서 vscode 주피터노트북에서para = 0 while hwp.set_pos(0, para, 0): if hwp.is_empty_para(): hwp.set_style("개요 1") para += 1이런 식으로 실행해보시면 될 듯 합니다.만약, 본문 빈 문단에 "글자처럼 취급"이 꺼진 그림이나 표의 컨트롤이 들어있는 경우에는 스타일 변경이 되지 않습니다ㅜ
- 1
- 1
- 63
질문&답변
스크립트 매크로 초기화 하고 싶습니다.
kun님 안녕하세요?1. 아래와 같은 방법으로 우회하면 가능합니다. 아래아한글 프로그램을 통해 해당 파일을 hwpx 포맷으로 저장한다.확장자를 zip으로 바꾸고 압축을 해제한다.Scripts 폴더의 sourceScripts 파일을 삭제한다.다시 zip 포맷으로 압축한 후, 확장자를 hwpx로 바꾼다.다시 아래아한글 프로그램을 통해 원래 포맷으로 변환한다. 2. 팝업을 띄우지 않는 방법은 해당 팝업은 [Y/N] 타입으로 hwp.SetMessageBoxMode(0x20)코드를 미리 실행하여 "No"를 자동선택할 수 있습니다. 파이썬으로는 zipfile 등의 모듈로 압축해제 및 압축시 문제없이 해결이 됨을 확인하였습니다. 아래는 후다닥 작성해본 관련 주피터노트북 파일입니다.문서스크립트를 제거할 hwp 파일들이 있는 폴더 안에 넣고셀 하나씩 실행하시면 됩니다. [노트북 파일] 추가 문의 있으시면 자유롭게 댓글 남겨주시기 바랍니다.행복한 하루 되세요^^
- 1
- 2
- 168
질문&답변
표안의 특정 필드에 있는 이미지를 복사하여 한글 외부에 저장하기
혹시 "복사"란 게 파일로 저장하기를 말씀하시는 건가요?혹시 다른 문서에 붙여넣기하거나 "클립보드"로 복사하는 등 다른 작업이라면 추가댓글 남겨주세요ㅎ 우선은 해당 한/글 문서를 열어놓은 상태로아래 코드를 실행해서 아래아한글을 실행해줍니다.from pyhwpx import Hwp hwp = Hwp()우선, 이미지를 저장하려면 어찌됐든 "찾아가서", "저장" 해야 합니다.다행히 각각 셀필드가 있다고 하시니① hwp.move_to_field("이미지가들어있는필드명")을 실행하셔서 필드로 커서를 옮기신 후에,② hwp.SelectCtrlFront()명령어로 이미지를 선택합니다. (셀 하나에 이미지 하나라면 사실 ②는 생략하셔도 됩니다.)③ hwp.save_image(f"./{필드명}.png") 명령어로 이미지를 저장합니다. 만약에 클립보드로 복사하시겠다면 hwp.save_image 대신 hwp.Copy()를 실행하시면 되고, 다른 문서에 붙여넣으시려면 hwp.Copy() 대신 아래처럼 # 위 코드로 이미지를 선택한 상태에서 img = hwp.GetTextFile("HWP", option="saveblock:true") # 붙여넣기할 문서의 셀에 커서를 둔 채로 hwp.SetTextFile(img, "HWP")이런 식으로 클립보드를 쓰지 않고, 문자열로 붙여넣기도 가능합니다. 혹시 추가질문 있으시면 댓글을 남겨주세요.제가 다소 막연하게 이해한 부분이 있는 것 같아서^^;막연한 설명을 붙이기보다는, 추가댓글을 읽고 구체적으로 회신을 드리겠습니다. 행복한 하루 되세요!!!~
- 1
- 2
- 172
질문&답변
하위의 여러 폴더 중 특정폴더의 사진만 추출하기
안녕하세요?어려운 코드는 아니지만, 두 가지 주제로 분리해서 설명을 드려야 할 것 같습니다. ① 하위 폴더의 모든 파일과 경로를 파이썬으로 가져오기현재 폴더의 파일이나 폴더 목록은 os.listdir() 로 간편하게 구할 수 있지만,하위 폴더의 파일 목록까지 한 번에 구하고 싶으시다면 os.walk() 라는 함수를 쓰시는 것이훨씬 간편합니다. 예를 들어 하위폴더와 파일목록이 아래와 같을 때(사진) 아래와 같은 함수를 정의하여 실행하면(경로명 키를 가진 dict를 정의했습니다. 각 값은 해당 경로의 jpg 파일의 절대경로 리스트입니다.)import os def get_jpg_files_by_directory(root_dir="."): jpg_dict = {} for dirpath, _, filenames in os.walk(root_dir): jpg_files = [os.path.abspath(os.path.join(dirpath, f)) for f in filenames if f.lower().endswith(".jpg")] if jpg_files: # 파일이 있는 폴더만 추가 jpg_dict[dirpath] = jpg_files return jpg_dict결과는 아래와 같습니다.>>> jpg_files_dict = get_jpg_files_by_directory() >>> print(jpg_files_dict) { '.\\sub1': [ 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\A-1.jpg', 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\A-2.jpg', 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\A-3.jpg' ], '.\\sub1\\sub2': [ 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\B-1.jpg', 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\B-2.jpg', 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\B-3.jpg' ], '.\\sub1\\sub2\\sub3': [ 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\C-1.jpg', 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\C-2.jpg', 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\C-3.jpg' ], '.\\sub1\\sub2\\sub3\\sub4': [ 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\sub4\\D-1.jpg', 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\sub4\\D-2.jpg', 'C:\\Users\\user\\Desktop\\콘텐츠예제\\이미지경로\\sub1\\sub2\\sub3\\sub4\\D-3.jpg' ] } 위와 같은 데이터구조를 만들면,하위경로별로 각각의 key가 있고 그 안에 값으로 jpg파일 리스트가 있으므로순차적으로 이미지를 삽입하기 쉽습니다. (물론 더 효율적인 좋은 방법이 있을 수도 있습니다.) ② 아래아한글에 이미지 넣기아래아한글 API가 다소 복잡하므로, 저는 최근에 거의 항상 pyhwpx 모듈을 이용해서간단한 명령어들을 처리하고 있습니다.pyhwpx 모듈에 대한 구체적인 설명은 위키독스(링크)에서 확인하실 수 있습니다. pyhwpx에서는hwp.create_table(rows, cols, treat_as_char)로 간편하게 표를 생성하고,hwp.insert_picture(img) 메서드로 셀 안에서 이미지를 삽입하실 수 있습니다. 아래는 pyhwpx를 통해 위 이미지 목록을 간단히 hwp 파일에 삽입하는 예시코드입니다.(사진)for k in jpg_files_dict.keys(): hwp.set_font(Height=25) # 글자크기를 25로 hwp.insert_text(k) # 경로명 삽입 hwp.BreakPara() # 엔터 hwp.create_table(rows=1, cols=1, treat_as_char=True) # 1x1의 글자취급표 생성 for img in jpg_files_dict[k]: # 경로명 키를 순회하면서 hwp.insert_picture(img) # 경로 내의 jpg파일 삽입 hwp.TableAppendRow() # 아래에 새 셀 생성 hwp.Run("TableSubtractRow") # 마지막에 생성된 빈 셀은 제거 hwp.MoveDown() # 표 아래로 내려가서 hwp.BreakPage() # Ctrl-Enter(페이지 나누기)이런 식으로 활용하실 수 있습니다.라인별 주석을 참고해주시기 바랍니다. 엑셀 파일에 경로가 명시되어 있다면 해당 엑셀파일을 판다스 등으로 가져오셔서os.walk나 위 dict 자료 대신 활용하시면 더 간편할 것입니다.부디 도움이 되었길 바랍니다. 추가 질문은 댓글로 남겨주세요.사실, 질문이 조금 두루뭉실한 느낌입니다. 샘플 데이터가 있으면 확실하게 코드로 보여드릴 수 있는데,아시겠지만ㅜ 제가 똑똑한 편이 아니어서ㅎㅎㅎ질문 자체를 이해하는 것도 상당한 에너지가 필요하네요ㅜ행복한 하루 보내시기 바랍니다!
- 1
- 2
- 244
질문&답변
누름틀 적용항목 vs 엑셀항목 간의 순서관련 질문
현우님 안녕하세요!!ㅎ연휴에도 이렇게 열심이신 걸 보면, 보통 분이 아니신데요?ㅎ 질문에 답변을 먼저 드리면,필드와 메일머지는 굉장히 유사하게 작동합니다. 다만, 엑셀에서 값을 가져올 때, 칼럼명을 빼고 값만 가져오는 경우에는말씀하신 것처럼, 작동할 수 있습니다. 이미 메일머지를 통해 값을 입력하는 개념을 잘 알고 계시니저를 포함하여 많은 업무자동화 전문가들이 즐겨 사용하는간편한 방법을 하나 미리 알려드리고자 합니다.강의에서 알려드린 코드는 밑바닥까지 직접 구현한 관계로 굉장히 복잡한데요,원리만 이해하시면 됩니다. 실제로는 이렇게 복잡하게 코딩하지 않습니다ㅜ 죄송 우선은 pywin32를 설치하셨던 것과 동일하게,터미널에서 pip install pyhwpx 명령어로 pyhwpx 모듈을 설치해주시기 바랍니다.(사진)혹은 주피터노트북의 아무 셀에서%pip install pyhwpx라고 한 번만 실행하셔도 됩니다. 설치를 완료하셨으면, 다시 주피터노트북으로 돌아가셔서기존에 입력하셨던 아래 코드를 실행하지 마시고import win32com.client as win32 hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") hwp.XHwpWindows.Item(0).Visible = True hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule") 아래의 코드를 대신 실행해보시기 바랍니다.from pyhwpx import Hwp hwp = Hwp()이렇게 아래아한글을 실행해도 대부분의 코드는 동일하게 사용하실 수 있지만,hwp.PutFieldText의 작동방식이 더 간편해지고,hwp.open 실행시, 전체경로를 입력하지 않아도 되는 등몇 가지 기능보완 및 편의기능이 추가되어 있습니다. 그럼 pyhwpx의 PutFieldText 활용예시를 몇 가지 보여드리겠습니다. 1. 엑셀파일 그대로 삽입만약 삽입할 데이터가 들어있는 엑셀파일이 깔끔하게 메일머지 형태로 정리되어 있는 경우hwp.PutFieldText(엑셀파일명)을 실행하면 엑셀의 값이 필드 안에 고스란히 들어가게 됩니다.(사진)질문 주셨던 것처럼, 엑셀문서 B열에 사이에 "별명" 칼럼이 끼어 있지만, 필드에 "별명"이 없으므로 누락되었습니다.이 방법이 제일 간편하다면 간편하지만, 파이썬 단에서 조금도 값을 수정할 수 없으므로미리 엑셀파일 안에 모든 값이 완벽하게 작성되어 있어야 합니다. 2. 엑셀파일을 판다스데이터프레임으로 불러온 후 삽입기왕 파이썬을 시작하셨다면, 꼭 pandas를 공부해보시는 걸 강력히 추천드립니다.엑셀파일을 다루는 것뿐만 아니라, 굉장히 방대한 데이터 처리 기능을 제공하므로비단 아래아한글이나 엑셀 업무자동화 뿐만 아니라 통계나 차트, 각종 분석 등 고급 업무에공부시간이 아깝지 않을 만큼 활용하실 수 있는, 파이썬의 가장 인기있는 라이브러리 중 하나입니다.하여튼, 엑셀파일을 판다스 데이터프레임으로 불러와서가공을 거친 후 삽입도 가능합니다.import pandas as pd df = pd.read_excel("엑셀파일.xlsx") # 데이터프레임 생성 df["특기"] = df["특기"] + "내기" hwp.PutFieldText(df)(사진)이런 방식으로 엑셀파일경로 문자열 대신 데이터프레임(df) 객체를 직접 집어넣을 수도 있습니다. 만약, 필드가 하나만 있고, 데이터프레임에서 특정 행만 넣고 싶은 경우는 아래처럼 실행하시면 됩니다.hwp.PutFieldText(df.iloc[[2]])(사진) iloc 활용방법df.iloc 는 "데이터프레임의 i번째 location"이라는 뜻입니다.i번째 행의 데이터만 골라서 넣겠다는 뜻입니다. 이게 굉장히 유용한 경우가 있는데요.메일머지로는 엑셀의 행 하나하나를 별도의 파일로 저장하는 것이 불가능합니다. 그런데 파이썬으로는 좀 더 세부적인 수준에서 필드를 다룰 수 있으므로,예를 들어 엑셀행이 500개가 있다고 할 때, 500개의 파일을 별도로 생성하는 것이 가능합니다.아래처럼 for문 안에서 실행하시면 됩니다.for i in range(len(df)): hwp.PutFieldText(df.iloc[[i]]) hwp.SaveAs(f"{df["이름"][i]}.hwp")(사진) 엑셀파일경로나 df 뿐만 아니라,파이썬의 리스트나 딕셔너리, 혹은 딕셔너리안의 리스트 자료형도동일하게 pyhwpx의 PutFieldText 기능을 통해 삽입 가능하므로아마 생각하시는 거의 모든 작업은 필드를 통해 가능할 것으로 생각됩니다. 처음 질문 주셨던, "특정 칼럼만 골라서 필드에 삽입" 하는 기능은win32com으로 구현하기에는 굉장히 까다로운 부분이 있는데데이터프레임이나, PutFieldText의 내장기능을 활용하면이렇게 간편하게도 구현할 수 있다는 점을 보여드리고 싶었습니다.답변이 되었을지 모르겠습니다^^;; 하여튼 질문 주셨던 것처럼, 특정 칼럼을 배제하려면딕셔너리 자료형으로 추출을 해서, 특정 칼럼명을 배제하거나아니면 처음부터 특정칼럼을 빼고 리스트로 만들거나........하여튼 상당히 까다롭습니다ㅜ 매번 이걸 코딩하기도 어렵고요. 가급적 위에 제안드린 방식을 한 번 검토해보시고실무에 적용하시는 걸 추천드립니다. 또 자동화하시면서, 혹은 자동화하시고자 하는 업무 관련하여 질문이 있으면언제든 편하게 추가질문 남겨주시기 바랍니다!!!! 감사합니다. 남은 연휴 잘 보내시기 바랍니다.행복한 하루 되세요^^
- 1
- 2
- 282





