소개
안녕하세요?
일상의코딩 블로그를 운영중인 일코입니다.
업무자동화와 관련한 콘텐츠 제작 및 강의 등을 하고 있습니다.
강의
전체 1수강평
- 너무 좋은 강의입니다.
xortit02
2024.09.24
1
- 좋아요 덕분에 잘 하고 있습니다.
kun
2024.06.04
1
게시글
질문&답변
2024.10.26
[강의 개선 의견] 실습용 파일이 미리 준비되도록 강의 전개순서 개선 건의
주현님 안녕하세요! 피드백 주셔서 감사합니다.강의 순서가 꼬인점이나 미흡한 부분을 살피지 못했네요ㅜㅜㅜ (반성합니다!)의견 주신 두 가지 부분 빠르게 반영해 두도록 하겠습니다. 진심으로 감사드립니다.다른 의견이 있으면 자유롭게 남겨주세요!행복한 하루, 편안한 주말 되시고요^^
- 2
- 1
- 35
질문&답변
2024.10.22
코드 정정방법 문의(문서 끼워 넣기 관련)
주현님, 안녕하세요?ㅎ 1. 첫 번째 오류의 원인은, os.listdir()명령어가 기본적으로 현재 폴더의 모든 파일/폴더목록을 가져오기 때문에 발생합니다.다시말해, .py 파일도 목록에 포함되어 있어서 그렇습니다.해결방법은①hwp파일만 필터링하거나,②명시적으로 ["1.hwp", "2.hwp", "3.hwp", "4.hwp", "5.hwp"] 로 순회를 돌리시면 됩니다. 첫 번째 방법은 아래와 같은 코드로 실행하시면 됩니다.from pyhwpx import Hwp # 임포트 hwp = Hwp() # 한/글 실행 import os # 끼워넣기 file_list = [i for i in os.listdir() if i.endswith(".hwp")] hwp.open(file_list[0]) # 첫 번째(0) 파일 열기 for i in file_list[1:]: # 첫 번째(0) 파일은 제외하고 두 번째(1)파일부터 아래 들여쓰기한 코드 반복 hwp.MoveDocEnd() # 한/글의 문서 끝으로 이동해서 hwp.BreakPage() # ② 두 번째 방법을 코드로 옮기면 아래와 같습니다.from pyhwpx import Hwp # 임포트 hwp = Hwp() # 한/글 실행 import os # 끼워넣기 file_list = ["1.hwp", "2.hwp", "3.hwp", "4.hwp", "5.hwp"] hwp.open(file_list[0]) # 첫 번째(0) 파일 열기 for i in file_list[1:]: # 첫 번째(0) 파일은 제외하고 두 번째(1)파일부터 아래 들여쓰기한 코드 반복 hwp.MoveDocEnd() # 한/글의 문서 끝으로 이동해서 hwp.BreakPage() # GUI 없이 코드로만 자동화를 진행하는 경우에는파이썬이 아래아한글로 어떤 문서를 열게 할지도자주 고민해야 하는 부분입니다. 예를 들어 1~5.hwp 외에도 여러 개의 한/글 파일이 같은 폴더에 들어 있는 경우에"{정수}.hwp" 형태의 파일만 골라 열어서 취합하고 싶으시다면아래처럼 코드를 수정하시면 됩니다.from pyhwpx import Hwp # 임포트 hwp = Hwp() # 한/글 실행 import os # 끼워넣기 file_list = [i for i in os.listdir() if i.endswith(".hwp") and i.split(".")[0].isdigit()] hwp.open(file_list[0]) # 첫 번째(0) 파일 열기 for i in file_list[1:]: # 첫 번째(0) 파일은 제외하고 두 번째(1)파일부터 아래 들여쓰기한 코드 반복 hwp.MoveDocEnd() # 한/글의 문서 끝으로 이동해서 hwp.BreakPage() # 이건 아래아한글 자동화보다는 파이썬 기본문법에 가까운 분야라서,파이썬 문법을 어느 정도 병행해서 조금씩 접하시다 보면 필요한 수준의 지식은 자연스럽게 익히시게 될 겁니다. 2. import win32com.client를 쓰지 않는 이유 pyhwpx라는 모듈을 통해 hwp = Hwp()라는 명령어 안에아래 코드가 포함되어 있습니다.import win32com.client as win32 hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") hwp.XHwpWindows.Item(0).Visible = True hwp.RegisterModule("FilePathCheckDLL","FilePathCheckerModule")그 외에도, ① RegisterModule이 실행되지 않는 경우 직접 FilePathCheckerModule을 다운로드,② 레지스트리에디터에 FilePathCheckerModule을 새로 등록,③ 현재 열려 있는 아래아한글 창이 있으면 새 창을 열지 않고 최근에 열린 한/글 창에 연결할 수 있게,이런 부가적인 동작이 포함되어 있습니다. 아래아한글 자동화를 공부하면서개인적인 편의 목적으로 만들어서 활용하던 함수들이 제법 많았습니다.이 코드들을 다른 분들과 공유하면 좋겠다는 마음에서 pip으로 편하게 설치할 수 있게 오픈소스로 올해 초 온라인에 공개를 했습니다.소스코드인 pyhwpx.py 파일을 열어보면대부분 win32com 코드로 만들어져 있습니다.pyhwpx.Hwp 클래스의 인터페이스 자체는 win32com으로 생성하는 hwp와 거의 동일하지만특정 액션, 예를 들면 hwp.GetText, hwp.PutFieldText 등의 메서드나 CreateTable 같은 액션은업무자동화 프로세스를 직접 짜보면 단순한 작업인데도 코드가 수십줄로 길어지게 됩니다.그리고 이게 입문자에게 가장 큰 진입장벽이더라고요. 그래서 편의를 위해 일부 확장 명령어를 제공한다든지,기존의 액션을 조금 보완한다든지, 그렇게 다듬어 가고 있는 중입니다. 그래서, 굳이 pyhwpx를 쓰실 필요는 없습니다.win32com으로 업무자동화 코드를 짤 수 있는 어느 정도 수준이 되시고 나면업무 특성에 따라 굉장히 자주 반복되는 패턴들이 보이실 거고, 그런 코드는 저장해 뒀다가 자주 재활용하시게 될텐데pyhwpx도 일종의 "미리 저장해 둔 코드모음" 같은 거라서요.. 답변이 되었길 바랍니다^^;
- 1
- 1
- 55
질문&답변
2024.10.22
여러 개의 한글 문서를 합치는 방법 관련 후속 문의
주현님 안녕하세요?hwp.insert_file 메서드는 아래아한글의 문서 끼워넣기( Ctrl- O )와 동일한 기능입니다.아래아한글에서 (아마 특정 버전 이상부터는)아래와 같은 옵션을 주고 문서를 25번 끼워넣기 하는 것과 같은데요.(사진)위 화면에서 쪽 모양 유지 옵션이, 별도의 페이지로 끼워넣는 기능입니다. 추측해보건대, 주현님의 아래아한글 버전과 제 버전이 달라서 생기는 차이 아닌가 싶습니다.hwp.insert_file(i, keep_section=True)로 파라미터를 추가하고 실행해도한 페이지에 텍스트가 모두 들어가버린다면, hwp.BreakPage()를 추가로 실행하시면 되겠습니다.코드는 아래와 같습니다.#... # 끼워넣기 hwp.open(os.listdir()[0]) # "개구리.hwp" 열기 for i in os.listdir()[1:]: # 첫 번째(0) 파일은 제외하고 두 번째(1)파일부터 아래 들여쓰기한 코드 반복 hwp.MoveDocEnd() # 한/글의 문서 끝으로 이동해서 hwp.BreakPage() # 이렇게 hwp.BreakPage()를 추가해서 다시 실행해보시면 페이지가 나눠져서 병합되어 있을 것입니다.
- 2
- 1
- 79
질문&답변
2024.10.18
동일한 데이터 프레임 구조에서 엑셀 자료를 한글로 반복적으로 변환하기
sannim12님 안녕하세요?^^아마 강의 초반에 "누름틀"과 "셀필드"에 대한 이야기가 조만간 나올 겁니다.말씀하신 경우처럼 동일한 포맷에 값만 바뀌는 경우에는"필드"를 사용하는 게 가장 적절한 듯 싶습니다.특히 표라면 "셀필드"를 미리 넣어두면 작업이 엄청나게 간편해집니다. 1. 셀필드를 넣는 방법은 아래와 같습니다.(사진)"셀" 탭의 "필드이름"란에 임의의 값을 넣고 저장하시면 됩니다.저는 "data"라는 필드이름을, 값이 삽입될 모든 셀에 적용하였습니다. 2. pyhwpx 모듈을 설치해야 합니다.pip install pywin32로 win32com 패키지 설치하셨던 것과 동일하게pyhwpx 모듈도 pip install pyhwpx 명령어로 설치하실 수 있습니다. 3. 설치하셨으면 아래 코드를 실행해봅니다.(사진)(매번 엑셀값 변경 후 Ctrl-S를 눌러 저장하고 있습니다.)from pyhwpx import Hwp import pandas as pd hwp = Hwp() # 아래아한글 실행 (또는 현재 열려있는 문서에 연결) df = pd.read_excel("샘플문서.xlsx") # 데이터프레임 만들기 hwp.PutFieldText("data", # "data"는 문서의 셀필드 이름 df.values.flatten().tolist()) # 데이터프레임의 값만 셀필드 안에 넣기 간편하죠?이렇게 한/글 문서에 필드를 적용해 두면hwp.put_field_text() 메서드 한 줄을 통해서엑셀이나 다른 문서의 값을 손쉽게 삽입할 수 있습니다. TMI)win32com의 hwp.PutFieldText와 pyhwpx의 hwp.put_field_text는 작동방식이 다르므로 유의 바랍니다.put_field_text는 대량의 데이터를 한 번에 삽입할 수 있게 작동방식을 조금 변경해 두었습니다. 혹시 동일한 문서로 실습해보시려면여기에서 다운로드받으셔서 압축을 풀어주세요.동영상에서 사용한 엑셀(샘플문서.xlsx) 및 한/글 문서(샘플문서.hwp)가 같이 들어있습니다. 추가로 궁금하신 부분은 댓글 남겨주세요^^
- 1
- 2
- 55
질문&답변
2024.10.18
셀 배경색 구하기
kun님 안녕하세요? 파이썬 기준으로현재 셀의 색을 조회하는 방법은셀 안에 커서를 둔 상태로 (셀블록 상태가 아니어도 됩니다.)아래 세 줄의 코드를 실행하시면 됩니다.pset = hwp.HParameterSet.HCellBorderFill # 빈 파라미터셋 pset 생성 hwp.HAction.GetDefault("CellBorderFill", pset.HSet) # pset에 현재 셀 속성값 채우기 color = pset.FillAttr.WinBrushFaceColor셀에 아무 색도 적용되어 있지 않다면(초기상태라면)값이 0입니다.(TMI ?) 흰색과 초기상태는 겉보기는 같지만 리턴하는 속성값이 다른데, 흰색을 적용했으면 16777215를 리턴합니다.그리고 만약, 셀의 색을 제거하고 싶은 경우"흰색"이 아니라 "초기"상태로 되돌리려면4294967295를 적용해야 합니다.(사진) 그래서, FindCellColor() 함수만 조금 수정해보면,def FindCellColor(): pset = hwp.HParameterSet.HCellBorderFill hwp.HAction.GetDefault("CellBorderFill", pset.HSet) return 1 if pset.FillAttr.WinBrushFaceColor else 0이렇게 바꿔볼 수 있겠습니다.(사진)추가로 궁금한 점 있으면 댓글 남겨주세요^^
- 1
- 2
- 32