작성
·
24
1
수학/과학이나 알고리즘과는 달리
업무자동화 코딩은 고민해서 풀리는 경우가 정말 드뭅니다.
다시 말씀드리지만, 질문을 자주자주 남겨주세요.
저도 최대한 빠르게 회신 드리겠습니다.
====================================
hwp.set_table_width()
이 함수가 특정 파일에선 안먹힙니다..ㅠㅠ
해당 한글 파일의 설정을 변경하거나 조정해야 할 부분이 있을까요? 일반적인 파일은 다 잘됩니다!
답변 2
1
상민님 안녕하세요?
저도 이것저것 테스트를 해봤는데ㅜ
문제가 되는 경우를 아직 찾지 못했습니다.ㅜ
대신 실행이 안 되는 이유를 몇 가지 짐작해보면,
① 커서위치가 표보다 우측이나 아래에 있으면 실행이 되지 않습니다.
내부적으로 hwp.SelectCtrlFront()
메서드를 사용해서 표에 접근하기 때문입니다.
② 커서와 표 사이에 다른 컨트롤이 있어도 실행되지 않습니다.
위와 동일한 이유로, hwp.SelectCtrlFront()
는 우측이나 아래의 가장 가까운 컨트롤을 선택하기 때문입니다.
③ 메서드 내부에서 표 부분만 XML 추출을 하는데요..
만약 표가 XML로 딱 잘려 나올 수 있는 모양이 아니라면? 오류가 날 수도 있을 것 같습니다. (추측ㅜ)
그 외에는... 아무리 생각해봐도 이유를 잘 모르겠습니다;;;
코드가 제법 긴 편이어서 어딘가에서 오류가 날 수는 있겠다고 생각합니다.
코드 전체는 대략 아래와 같습니다. 주석을 열심히 달아보았습니다.
def set_table_width(self, width: int = 0, as_: Literal["mm", "hwpunit", "hu"] = "mm"):
"""
표 전체의 너비를 원래 열들의 비율을 유지하면서 조정하는 메서드.
내부적으로 xml 파싱을 사용하는 방식으로 변경.
:param width: 너비(단위는 기본 mm이며, hwpunit으로 변경 가능)
:param as_: 단위("mm" or "hwpunit")
:return: 성공시 True
"""
if not width: # 만약 값을 입력하지 않고 `hwp.set_table_width()`라고만 실행하면?
sec_def = self.hwp.HParameterSet.HSecDef # 구역정보를 받아서
self.hwp.HAction.GetDefault("PageSetup", sec_def.HSet)
width = (
sec_def.PageDef.PaperWidth - sec_def.PageDef.LeftMargin - sec_def.PageDef.RightMargin - sec_def.PageDef.GutterLen
- self.get_table_outside_margin_left(as_="hwpunit") - self.get_table_outside_margin_right(
as_="hwpunit")) # 표의 목표너비를 용지영역과 동일하게 설정
elif as_ == "mm": # 메서드를 실행할 때 정수 값을 입력했다면
width = self.mili_to_hwp_unit(width) # 해당 정수값으로 표 목표너비를 설정
ratio = width / self.get_table_width(as_="hwpunit") # 현재 표의 너비와 목표너비의 비율 계산
cur_pos = self.get_pos() # 현재 위치 저장해 두고(메서드실행 끝나면 돌아가기 위해서)
self.SelectCtrlFront() # 전방(문서 끝 방향)으로 컨트롤을 찾아감.
ctrl = self.CurSelectedCtrl # 현재 선택한 컨트롤을
t = self.GetTextFile("HWPML2X", "saveblock") # XML 포맷 문서데이터로 저장
root = ET.fromstring(t) # 저장한 데이터 파싱 시작
table = root.find('.//TABLE') # 표를 찾아서
if table is not None: # 표를 찾았으면
for cell in table.findall('.//CELL'): # 셀을 찾아서
width = cell.get('Width') # 셀의 너비를 추출한 다음,
if width: # (셀의 너비가 0이 아니라면)
cell.set('Width', str(int(width) * ratio)) # 위에서 저장한 "비율"을 곱함.
t = ET.tostring(root, encoding='UTF-16').decode('utf-16') # 변경한 데이터 저장.
cur_view_state = self.ViewProperties.Item("OptionFlag") # 조판부호 보기상태 현재값 저장(메서드 끝나고 원상복구 예정)
if cur_view_state not in (2, 6): # 조판부호가 보이는 상태가 아니면
prop = self.ViewProperties
prop.SetItem("OptionFlag", 6) # 조판부호 보이게 설정변경(모든 경우에 표를 제대로 선택하기 위함)
self.ViewProperties = prop
self.move_to_ctrl(ctrl) # 처음 선택했던 표(조판부호 앞)으로 이동
self.MoveSelRight() # 표컨트롤 선택
self.SetTextFile(t, format="HWPML2X", option="insertfile") # 표내용을 XML변경데이터로 덮어씌움
prop = self.ViewProperties # 조판부호 보기상태 되돌림
prop.SetItem("OptionFlag", cur_view_state)
self.ViewProperties = prop
self.set_pos(*cur_pos) # 처음 커서위치로 되돌아감
혹시 괜찮으시다면, 오류가 나는 문서를 공유해주시면 감사하겠습니다.
set_table_width 메서드를 업데이트하는데 큰 도움이 될 것 같습니다.
제 메일주소는 martinii.fun@지메일입니다.
행복한 하루 되세요!!!
그렇네요! 바탕쪽에 이것저것 넣고 나니까 제 PC에서도 실행이 안 되네요!ㅎ
바로 고쳐보려고 했는데,
생각보다 간단하지가 않은 것 같아요ㅜㅜㅜ
주말 중에 손을 한 번 보고 댓글 달아놓겠습니다.
알려주셔서 감사합니다!!!
행복한 하루 되세요^^
1
안녕하세요, 인프런 AI 인턴입니다. 이상민님, pyhwpx의 set_table_width()
함수가 특정 파일에서 작동하지 않는 상황에 대해 질문 주셨습니다.
이러한 상황은 여러 가지 요인에 의해 발생할 수 있습니다. 우선, pyhwpx 라이브러리와 관련된 설정이나 함수가 특정 파일 포맷이나 내부 구조와 호환되지 않는 경우일 수 있습니다. 예를 들어, 표의 스타일, 속성이나 특정 보안 설정에 의해 함수가 적용되지 않을 수 있습니다.
아래 링크들을 참고하시면 문제 해결에 도움이 될 수 있습니다:
pyhwpx에서 한글 창을 최대로 키우는 코드가 무엇인가요
파일에 따라 기능이 다르게 작동하는 이유가 일반적으로 아예 다른 구조를 가지거나, 소소한 설정 차이 때문일 수 있으므로, 문제가 발생하는 파일과 정상 파일의 차이를 비교하면서 문제를 해결하려고 시도해 보세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변주셔서 감사합니다!!
메일보내려고 본문 삭제하다보니 바탕쪽 홀,짝수 조판부호가 남아있어서 지워보니 잘 작동하더군요...........
결과적으로 바탕쪽에 표가 들어있으면 실행이 안되는것 같습니다!!!