일코
@ilco
미들 (4~8년)·
SW 엔지니어
앤스랩
수강생
835
수강평
55
강의 평점
4.9
멘토링 신청
-
멘토링 리뷰
-
멘토링 평점
-
안녕하세요?
일상의코딩 블로그를 운영중인 일코입니다.
업무자동화와 관련한 콘텐츠 제작 및 강의 등을 하고 있습니다.
업무자동화 교재를 몇 권 읽고 난 후,
자기업무를 코딩으로 자동화할 때는
새롭고 생소한 난관에 거의 무조건 빠지게 될 겁니다.
실무의 세상은 너무 다양하고, 또 예측하기 힘드니까요.
그래서 멘토링이 필요한 때가 분명히 찾아온다고 생각합니다.
제한적인 교재나 영상의 한계에 갇히지 마시고
본인의 무한한 상상력을 코드로 옮길 수 있도록
생각의 장벽을 허물어드릴 수 있는
가치있는 코칭과 멘토링을 제공해드리겠습니다.
저는 파이썬-아래아한글 및 엑셀 자동화 7년차, 현재는 프리랜서이며
300여 건의 크고작은 자동화 프로젝트를 진행해 왔습니다.
특히 공공기관 행정업무나, 학교, 학원 등
아래아한글과 엑셀을 주로 다루는 분야에서
업무를 효율적이고 빠르게 처리하기 위한 프로그램을 주로 제작해 왔으며
최근에는 스마트스토어, 쿠팡윙스, 카카오쇼핑하기 등의 서비스에서
다양한 정보를 크롤링하고 자동으로 보고서를 제작하는 서비스를 제공하고 있습니다.
여러분이 당면한 문제에 대해
언제든 자유롭게 상담요청 해주시기 바랍니다.
저도 온 마음으로 여러분의 문제를 경청하고
미약하지만 제 수준에서 도움드릴 수 있는 부분을 찾아보겠습니다.
감사합니다.
강의
수강평
- 직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
- 직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
- 직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
게시글
질문&답변
한글 표 내부 위치 찾는 코드좀 알려주세요 ㅠㅠ
pyhwpx 모듈을 사용하신다는 전제하에,문서의 첫 번째 표, 첫 번째 셀(A1)로 이동하는 명령어는hwp.get_into_nth_table(0) 입니다. (0은 생략 가능합니다.) (사진) 답변이 늦어 죄송합니다.도움이 되었길 바랍니다.행복한 하루 되세요!^^
- 1
- 2
- 141
질문&답변
본문을 각주로 내리는 법
호석님 안녕하세요?답변이 늦었습니다.질문 주신 내용에 대한 특정 챕터가 있지는 않습니다.본 답변에 최대한 구체적으로 설명을 드리고자 합니다.만약 이해가 잘 안 되는 부분이 있다면 추가질문 주시기 바랍니다.여러가지 방법이 생각나지만, 그래도 제가 가장 효율적이라고 생각하는 방법은"찾기"를 활용하는 것입니다. 단, 각주로 바꿀 구간의 마지막에만 닫는 괄호가 있어야 합니다.(이런 제한조건을 두지 않는다면 굉장히 많은 분량의 예외처리를 해야 하는데 그게 참 어렵습니다.)그리고, 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
- 47
질문&답변
빈 문서를 새로 열때는 팝업이 안나오는데 기존 문서를 열면 팝업이 나옵니다
새 파일에는 원래 보안팝업이 뜨지 않습니다.아직 레지스트리등록이 정상적으로 되지 않은 것으로 보입니다. 다시 시도해주시기 바랍니다.혹은 가상환경 터미널에서 (pywin32 모듈을 설치했을 때와 동일하게)pip install pyhwpx 명령어로 pyhwpx 모듈을 설치하신 후에 from pyhwpx import Hwp hwp = Hwp()명령어로 아래아한글을 실행하시는 것도 한 가지 대안입니다. 참고해주시기 바랍니다.행복한 하루 되세요^^
- 1
- 2
- 75
질문&답변
한글 자동화 삽도 삽입!!
ㅇㅇㅇㅇ님! 메일로 코드 송부드렸습니다. 확인 부탁드립니다.행복한 하루 되세요!!!
- 1
- 2
- 200
질문&답변
특정 스타일을 찾아 이동하는 방법
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
- 113
질문&답변
현재 커서 문단에 아무런 내용이 없는지 확인하기
안녕하세요!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
- 81
질문&답변
스크립트 매크로 초기화 하고 싶습니다.
kun님 안녕하세요?1. 아래와 같은 방법으로 우회하면 가능합니다. 아래아한글 프로그램을 통해 해당 파일을 hwpx 포맷으로 저장한다.확장자를 zip으로 바꾸고 압축을 해제한다.Scripts 폴더의 sourceScripts 파일을 삭제한다.다시 zip 포맷으로 압축한 후, 확장자를 hwpx로 바꾼다.다시 아래아한글 프로그램을 통해 원래 포맷으로 변환한다. 2. 팝업을 띄우지 않는 방법은 해당 팝업은 [Y/N] 타입으로 hwp.SetMessageBoxMode(0x20)코드를 미리 실행하여 "No"를 자동선택할 수 있습니다. 파이썬으로는 zipfile 등의 모듈로 압축해제 및 압축시 문제없이 해결이 됨을 확인하였습니다. 아래는 후다닥 작성해본 관련 주피터노트북 파일입니다.문서스크립트를 제거할 hwp 파일들이 있는 폴더 안에 넣고셀 하나씩 실행하시면 됩니다. [노트북 파일] 추가 문의 있으시면 자유롭게 댓글 남겨주시기 바랍니다.행복한 하루 되세요^^
- 1
- 2
- 214
질문&답변
표안의 특정 필드에 있는 이미지를 복사하여 한글 외부에 저장하기
혹시 "복사"란 게 파일로 저장하기를 말씀하시는 건가요?혹시 다른 문서에 붙여넣기하거나 "클립보드"로 복사하는 등 다른 작업이라면 추가댓글 남겨주세요ㅎ 우선은 해당 한/글 문서를 열어놓은 상태로아래 코드를 실행해서 아래아한글을 실행해줍니다.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
- 203
질문&답변
하위의 여러 폴더 중 특정폴더의 사진만 추출하기
안녕하세요?어려운 코드는 아니지만, 두 가지 주제로 분리해서 설명을 드려야 할 것 같습니다. ① 하위 폴더의 모든 파일과 경로를 파이썬으로 가져오기현재 폴더의 파일이나 폴더 목록은 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
- 279
질문&답변
누름틀 적용항목 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
- 415
블로그
전체 3![[pyhwpx] 한/글 자동화 문의 및 요청의 90%는 ㅇㅇ 관련이었어요.](https://cdn.inflearn.com/public/files/blogs/d3ade4cc-cbf9-488d-9882-ef2701f8399d/DALL·E 2024-01-27 04.42.35 - A young professional woman working on a computer, illustrated in a colorful modern Japanese manga style, similar to the previous depiction. She is dre.png?w=260)
2024. 01. 27.
3
[pyhwpx] 한/글 자동화 문의 및 요청의 90%는 ㅇㅇ 관련이었어요.
안녕하세요? 일코입니다. 유튜브와 블로그를 운영하면서 받았던 문의 중 90%는바로 "표"에 관한 내용들이었습니다.표는 비단 행정뿐만 아니라,한/글을 통해 작성되는 문서에서 가장 많이 쓰이는 컨트롤이죠.그런데 기존의 한/글 오토메이션 API를 통해 표를 읽어오거나, 표를 작성하는 메서드는다소 큰 진입장벽이 있었습니다. 예를 들어 비교적 최근 만든 pyhwpx에서5행5열의 표를 만들고 "글자처럼 취급"을 적용하는 코드는아래 세 줄이면 되지만,from pyhwpx import Hwp hwp = Hwp() hwp.create_table(5, 5, treat_as_char=True) 그런데,기존 오토메이션API를 통해 동일한 표를 직접 생성하려면무려 아래의 코드를 작성해야 합니다.(한/글 오토메이션API에 관심있으신 분은, 차근차근 읽어보셔도 좋습니다.)import win32com.client as win32 hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") hwp.XHwpWindows.Item(0).Visible = True hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule") rows = 5 # 행 갯수 cols = 5 # 열 갯수 width_type = 0 # 너비: 단에 맞춤 height_type = 0 # 높이: 자동 height = 0 # height 기본값 초기화 treat_as_char = True # 글자처럼 취급 pset = hwp.HParameterSet.HTableCreation hwp.HAction.GetDefault("TableCreate", pset.HSet) # 표 생성 시작 pset.Rows = rows pset.Cols = cols pset.WidthType = width_type # 너비 지정(0:단에맞춤, 1:문단에맞춤, 2:임의값) pset.HeightType = height_type # 높이 지정(0:자동, 1:임의값) sec_def = hwp.HParameterSet.HSecDef hwp.HAction.GetDefault("PageSetup", sec_def.HSet) total_width = (sec_def.PageDef.PaperWidth - sec_def.PageDef.LeftMargin - sec_def.PageDef.RightMargin - sec_def.PageDef.GutterLen - hwp.MiliToHwpUnit(2)) pset.WidthValue = hwp.MiliToHwpUnit(total_width) # 표 너비 if height and height_type == 1: # 표높이가 정의되어 있으면 total_height = (sec_def.PageDef.PaperHeight - sec_def.PageDef.TopMargin - sec_def.PageDef.BottomMargin - sec_def.PageDef.HeaderLen - sec_def.PageDef.FooterLen - hwp.MiliToHwpUnit(2)) pset.HeightValue = hwp.MiliToHwpUnit(height) # 표 높이 pset.CreateItemArray("RowHeight", rows) # 행 m개 생성 each_row_height = total_height - hwp.MiliToHwpUnit(rows) for i in range(rows): pset.RowHeight.SetItem(i, each_row_height) # 1열 pset.TableProperties.Height = total_height pset.CreateItemArray("ColWidth", cols) # 열 n개 생성 each_col_width = total_width - hwp.MiliToHwpUnit(3.6 * cols) for i in range(cols): pset.ColWidth.SetItem(i, each_col_width) # 1열 # pset.TableProperties.TreatAsChar = treat_as_char # 글자처럼 취급 pset.TableProperties.Width = total_width # hwp.MiliToHwpUnit(148) # 표 너비 적용 hwp.HAction.Execute("TableCreate", pset.HSet) # 코드 실행 # 글자처럼 취급 여부 적용(treat_as_char) ctrl = hwp.CurSelectedCtrl or hwp.ParentCtrl pset = hwp.CreateSet("Table") pset.SetItem("TreatAsChar", treat_as_char) ctrl.Properties = pset결과는 위와 동일합니다 고작 표 하나를 만들기 위해질릴만큼 길고 복잡한 저 API코드를 작성해야 한다는 사실을 알게 되면(특히 회사원들) 어느 누가 한/글 자동화를 시도할까 싶었습니다.전부 언급할 수도 없는 상당한 분량의 백그라운드 지식을 알려주는 것도 큰 부담이었습니다.아래아한글 API의 구조와 실행방법, 파라미터셋 사용법,파라미터셋의 서브아이템셋을 정의해야 하는 경우와 정의방법,암호같은 API 문서를 읽는 방법..ㅜ 작년말에 금융감독원 연수원에서 아래아한글 자동화 강의요청을 해 주셨거든요.시간은 짧고, 할 말은 많고, 저런 무지막지한 API 코드 보여주면 재미가 없을 것 같아서현업에 쓰일 법한 함수들을 묶어서 시연 위주로 보여드렸는데,그게 계기가 되어,아래아한글 보고서작성 자동화를 위한pyhwpx라는 파이썬모듈을 개발하게 되었습니다.하여튼 이제는 나름의 버전업을 거듭해서0.8 근처까지 왔는데요. 아직 갈 길이 멉니다.그럼에도 create_table, table_to_df나,table_from_data, get_into_nth_table, 특히 put_field_text는한/글 보고서 취합 및 작성 자동화나 엑셀연동에 진심인 분들에게는정말 파워풀한 메서드일 거라고 자부합니다.개발기간도 아직 짧은 편이고, 다소 조악해 보일 수 있습니다.하지만, 정말 수백 건의 문의와 의뢰를 받고 일일이 회신을 드렸던 모든 경험을pyhwpx 모듈에 하나씩 녹여내고 있습니다.pyhwpx 사용법도 알려주세요! - 인프런현재는 블로그와 인프런 QnA에 pyhwpx 짧은 메서드 사용법 위주로 포스팅하고 있지만,오는 2월부터는 작은 프로젝트나, 의뢰 / 문의내용을 토대로pyhwpx의 활용방법도 차근차근 영상과 포스팅으로 풀어볼 예정입니다.업무자동화에 관심이 있는 파이썬 초보 분들, 특히 직장인 분들많은 관심 부탁드립니다^^ 감사합니다.행복한 하루 되세요!
업무 자동화
・
pyhwpx
・
아래아한글
・
hwp
・
python
・
일상의코딩
・
일코
・
파이썬
・
create_table
・
한컴오피스
・
업무자동화
![[python+hwp] 글머리 기호의 모양만 수준별로 바꾸는 파이썬 코드](https://cdn.inflearn.com/public/files/blogs/ad508323-2045-474c-9b2b-91fbcc9b7548/304.png?w=260)
2023. 03. 09.
1
[python+hwp] 글머리 기호의 모양만 수준별로 바꾸는 파이썬 코드
문단 글머리 기호를 추출하고자 합니다.원래 목적은 문단별 글머리 기호가 다르고 문단별로 각각 다른 폰트를 적용이 목적입니다.GetHeadingString()을 써보니코드를 적용해서 커서를 옮겨도 문서를 최초 불러온 커서의 위치의 글머리 기호를 불러오네요..이유를 몰겟습니다. ㅠㅠ아래는 테스트 코드입니다.(후략)https://www.inflearn.com/questions/809257이 문제는 예를 들어서 설명하는 게 여러모로 좋을 것 같습니다.아래는 제가 임의로 만들어본 예시문서입니다.위와 같은 문서에서 제1수준(숫자로 시작하고 "." 으로 끝나는 문단기호)에는 "진하게(Bold)"를 적용하고제4수준("가나다" 등 문자로 시작하고 ")" 으로 끝나는 문단기호)에는 "기울임(Italic)"을 적용해보겠습니다.import win32com.client as win32 def 한글_시작(): hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") # 한/글 실행 hwp.XHwpWindows.Item(0).Visible = True # 백그라운드 해제 hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule") # 보안모듈 등록 return hwp def 진하게(): if not hwp.CharShape.Item("Bold"): # 진하게 적용되어 있지 않으면 hwp.Run("CharShapeBold") # 진하게 적용 def 이탤릭(): if not hwp.CharShape.Item("Italic"): # 이탤릭이 적용되어 있지 않으면 hwp.Run("CharShapeItalic") # 이탤릭 적용 if __name__ == '__main__': hwp = 한글_시작() hwp.Run("FileOpen") hwp.Run("MoveDocBegin") # 문서 시작점으로 이동해서 hwp.Run("MoveParaEnd") # 문단 끝으로 이동 para_num = 0 # 0번째 문단에서부터 while True: # 한문단씩 이동하면서 if hwp.GetPos() == (0,0,16): # 0번째 문단으로 돌아오면(!!) # 추가설명 : SetPos 입력시 문서범위를 벗어나서 이동을 시도하면 # 커서가 문서시작위치(0,0,16)로 돌아옵니다. # 이를 이용해 while 문 종료조건을 잡아보았습니다. break # while문 종료 hwp.SetPos(0, para_num, -1) # para_num번째 문단 끝(-1)으로 이동 para_head = hwp.GetHeadingString() # 글머리 추출 # 글머리가 숫자로 시작하고 "."으로 끝나면 if para_head[:-1].isdigit() and para_head.endswith("."): 진하게() # 글머리가 문자로 시작하고 ")"로 끝나면 elif para_head[:-1].isalpha() and para_head.endswith(")"): 이탤릭() # 글머리가 없거나 기타 글머리인 경우 else: pass # 넘어감 para_num += 1 # 다음 문단으로 이동해서 위의 코드 반복주석을 나름 꼼꼼히 달아보았는데,혹시 잘 납득이 안 가는 부분이 있으면댓글로 알려주시기 바랍니다^^실행화면은 아래와 같습니다.우리의 의도대로제1수준은 진하게, 제4수준은 이탤릭이 적용되는 것을 확인하실 수 있습니다.크게 어렵지 않고, 짧은 코드이긴 하지만..위와 같은 경우에는(여러 개의 한/글 파일을 변경하는 게 아니라면) 기왕이면 코딩을 사용하지 않고,Ctrl-K-N을 통해 문단번호의 글자모양 기본값을 통해문단수준별로 직접 변경하는 게 훨씬 안정적일 것 같기는 합니다^^;
업무 자동화
・
파이썬
・
아래아한글
・
업무자동화
・
한컴오피스

2022. 12. 28.
3
첫 포스팅을 작성해봅니다.
안녕하세요?반갑습니다. 일코입니다.이 블로그에서는 제 강의에서 미흡했던 일부 설명을 보충하는 포스팅을 틈틈이 적어보려고 합니다.제 아래아한글 강의에서는 통합개발환경으로 파이참이라는 프로그램을 활용하고 있습니다.파이참에는 유용한 단축키가 참 많지만, 그 중에도 제가 가장 많이 사용하는 단축키는Shift-Alt-E 입니다. 커서가 위치한 라인, 또는 선택한 라인들을 콘솔에 보내서 실행해주는 기능을 합니다.업무자동화 특성상 한/글이나 엑셀, 혹은 브라우저를 같이 열어놓고코드 한 줄 한 줄의 결과를 즉시 확인할 수 있기 때문에 아주 유용하게 쓰입니다.강의 영상에도 대부분 파이참을 화면 왼쪽에, 한/글이나 엑셀을 화면 오른쪽에 분할해서 띄워놓고코드를 일부 작성한 후에 실행하고 싶은 라인만 선택한 후에 Shift-Alt-E를 통해 결과를 확인합니다.보조모니터 없이 14인치 노트북으로 강의안을 만들기 때문에오밀조밀하게 작은 화면에서 이것저것 하려다 보니 이런 작업환경을 만들게 되었습니다. 제 강의를 따라하시는 여러분들도 한쪽에는 강의안을다른 한쪽에는 파이참과 한/글(또는 엑셀)을 띄워놓고 저와 비슷한 화면에서 작업하시면,실습하기 더욱 수월하실 겁니다. 이번 포스팅은 여기서 마치겠습니다.
업무 자동화
・
일코
・
회사원코딩
・
일상의코딩
・
아래아한글
・
업무자동화
・
파이참
・
작업환경
・
분할
・
실행방법
・
실습





