본문 바로가기
업무자동화/파이썬-아래아한글 자동화 응용

각각의 셀너비, 높이를 다르게 표를 생성하는 코드

by 회사원코딩 2020. 12. 6.

안녕하세요
선생님 유튜브, 블로그 강의를 열심히 따라하고 있는 파이썬 초보입니다.
 
제 업무에 적용해 보려고 열심히 코딩 중인데,
어려움이 생겨 도움을 요청하고자 실례를 무릅쓰고 이렇게 메일 드립니다.

아래 소스를 실행해 보면

hwp.HAction.GetDefault("TableCreate", hwp.HParameterSet.HTableCreation.HSet)
hwp.HParameterSet.HTableCreation.Rows = 3
hwp.HParameterSet.HTableCreation.Cols = 7
hwp.HAction.Execute("TableCreate", hwp.HParameterSet.HTableCreation.HSet)
hwp.HAction.Run("MoveTopLevelEnd")
hwp.HAction.Run("BreakPara")

hwp.HAction.GetDefault("TableCreate", hwp.HParameterSet.HTableCreation.HSet)
hwp.HParameterSet.HTableCreation.Rows = 5
hwp.HParameterSet.HTableCreation.Cols = 5
hwp.HAction.Execute("TableCreate", hwp.HParameterSet.HTableCreation.HSet)
hwp.HAction.Run("MoveTopLevelEnd")
hwp.HAction.Run("BreakPara")

첫번째 표는 잘 만들어집니다만, 두번째 표가 아래처럼 에러가 납니다.

 

File "d:\Git\test\python study\hwpt.py", line 23, in <module>
    hwp.HAction.Execute("TableCreate", hwp.HParameterSet.HTableCreation.HSet)
  File "C:\Users\xxxxxx\AppData\Local\Temp\gen_py\3.8\7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBCx0x1x0\HAction.py", line 35, in Execute
    return self._oleobj_.InvokeTypes(15001, LCID, 1, (11, 0), ((8, 1), (9, 1)),actname
pywintypes.com_error: (-2147417851, '서버에서 예외 오류가 발생했습니다.', None, None)

 

여러 검색을 해보았습니다만,
안되는 이유를 확인하지 못해 답답하네요
마티니 님께서 도움을 주시면 감사하겠습니다.

행복한 하루 되시길 바랍니다~

우선 위 오류는 TreatAsChar 속성을 설정해주지 않았기 때문에 발생합니다.

hwp.HParameterSet.HTableCreation.TableProperties.TreatAsChar = 1  # 글자처럼 취급

Execute 하기 전에 저 한 줄만 추가해주시면 잘 실행될 것입니다.

다만, 행과 열만 설정하고 실행시 문서여백 등을 무시한, 정말 무식한 표가 만들어지기 때문에,

아래 코드를 참고하여 보완하시길 바랍니다.

감사합니다.

 

 

(클릭) 자동으로 표 생성하는 코드 실행화면

동적으로 표 생성하는 코드 실행화면(위와 같음) 

아래아한글 문서 안에 표를 생성하는 코드입니다.

거의 대부분의 업무자동화 경우에는 hwp파일을 미리 만들어두고 복사해서 쓰시겠지만,

동적으로 대량의 표를 행과 열이 다르게 자동생성해야만 할 때 활용하실 수 있겠습니다.

코드 자체는 상당히 직관적이고, 복잡하지 않기 때문에 복사해 두고 쓰실 수 있습니다.

"""
아래의 148mm는 종이여백 210mm에서 60mm(좌우 각 30mm)를 뺀 150mm에다가,
표 바깥여백 각 1mm를 뺀 148mm이다. (TableProperties.Width = 41954)
각 열의 너비는 5개 기준으로 26mm인데 이는 셀마다 안쪽여백 좌우 각각 1.8mm를 뺀 값으로,
148 - (1.8 x 10 =) 18mm = 130mm
그래서 셀 너비의 총 합은 130이 되어야 한다.
아래의 라인28~32까지 셀너비의 합은 16+36+46+16+16=130
표를 생성하는 시점에는 표 안팎의 여백을 없애거나 수정할 수 없으므로
이는 고정된 값으로 간주해야 한다.
"""
#%%
import win32com.client as win32  # COM 임포트

#%%
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")  # 아래아한글 오브젝트 생성
hwp.XHwpWindows.Item(0).Visible = True  # 숨김해제

#%%
hwp.HAction.GetDefault("TableCreate", hwp.HParameterSet.HTableCreation.HSet)  # 표 생성 시작
hwp.HParameterSet.HTableCreation.Rows = 5  # 행 갯수
hwp.HParameterSet.HTableCreation.Cols = 5  # 열 갯수
hwp.HParameterSet.HTableCreation.WidthType = 2  # 너비 지정(0:단에맞춤, 1:문단에맞춤, 2:임의값)
hwp.HParameterSet.HTableCreation.HeightType = 1  # 높이 지정(0:자동, 1:임의값)
hwp.HParameterSet.HTableCreation.WidthValue = hwp.MiliToHwpUnit(148.0)  # 표 너비
hwp.HParameterSet.HTableCreation.HeightValue = hwp.MiliToHwpUnit(150)  # 표 높이
hwp.HParameterSet.HTableCreation.CreateItemArray("ColWidth", 5)  # 열 5개 생성
hwp.HParameterSet.HTableCreation.ColWidth.SetItem(0, hwp.MiliToHwpUnit(16.0))  # 1열
hwp.HParameterSet.HTableCreation.ColWidth.SetItem(1, hwp.MiliToHwpUnit(36.0))  # 2열
hwp.HParameterSet.HTableCreation.ColWidth.SetItem(2, hwp.MiliToHwpUnit(46.0))  # 3열
hwp.HParameterSet.HTableCreation.ColWidth.SetItem(3, hwp.MiliToHwpUnit(16.0))  # 4열
hwp.HParameterSet.HTableCreation.ColWidth.SetItem(4, hwp.MiliToHwpUnit(16.0))  # 5열
hwp.HParameterSet.HTableCreation.CreateItemArray("RowHeight", 5)  # 행 5개 생성
hwp.HParameterSet.HTableCreation.RowHeight.SetItem(0, hwp.MiliToHwpUnit(40.0))  # 1행
hwp.HParameterSet.HTableCreation.RowHeight.SetItem(1, hwp.MiliToHwpUnit(20.0))  # 2행
hwp.HParameterSet.HTableCreation.RowHeight.SetItem(2, hwp.MiliToHwpUnit(50.0))  # 3행
hwp.HParameterSet.HTableCreation.RowHeight.SetItem(3, hwp.MiliToHwpUnit(20.0))  # 4행
hwp.HParameterSet.HTableCreation.RowHeight.SetItem(4, hwp.MiliToHwpUnit(20.0))  # 5행
hwp.HParameterSet.HTableCreation.TableProperties.TreatAsChar = 1  # 글자처럼 취급
hwp.HParameterSet.HTableCreation.TableProperties.Width = hwp.MiliToHwpUnit(148)  # 표 너비
hwp.HAction.Execute("TableCreate", hwp.HParameterSet.HTableCreation.HSet)  # 위 코드 실행

# hwp.MovePos(3)  # 문서 끝으로 이동
728x90
반응형

댓글0