인프런 커뮤니티 질문&답변

정성봉님의 프로필 이미지
정성봉

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

표안에 셀 정렬속성은 어떻게 하나요?

해결된 질문

작성

·

51

1

def create_word_meaning_table(hwp, words_info):
    rows = len(words_info) + 1  # +1 for header
    cols = 6  # Adding a column for the number

    print(f"Creating table with {rows} rows and {cols} columns")

    height = 0  # height 기본값 초기화
    treat_as_char = 0  # 글자처럼 취급
    width_type = 0 # 너비 지정(0:단에맞춤, 1:문단에맞춤, 2:임의값)
    height_type = 0 # 높이 지정(0:자동, 1:임의값)

    # Create table
    pset = hwp.HParameterSet.HTableCreation
    hwp.HAction.GetDefault("TableCreate", pset.HSet)
    pset.Rows = rows
    pset.Cols = cols
    pset.WidthType = width_type
    pset.HeightType = height_type

    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.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

    
    hwp.Run("CloseEx")  # Exit table
    hwp.Run("BreakPara")  # Add a new line after the table

표(전체)의 정렬이나 셀 정렬을 하려면 어떻게 해야할까요?

 

 

 

답변 2

1

일코님의 프로필 이미지
일코
지식공유자

성봉님 안녕하세요?

답변이 늦어 죄송합니다.

 

표의 전체 셀이나 일부 셀을 정렬하는 기능은

표 생성 시점에는 조절이 불가능합니다. (파라미터에 없기 때문입니다.)

 

대신, 작성하신 코드로 표를 생성하시고 난 이후에

다시 표를 선택하여 정렬을 하셔야 합니다.

 

간단히 예를 들어보면,

지금 작성하신 코드는 표 생성 후 밖으로 나오는(CloseEx) 라인이 포함되어 있는데

그 직전(함수를 실행한 직후)에는 커서가 표의 A1 셀에 위치하고 있는 상태입니다.

 

그 상태에서 아래 코드를 실행하면 모든 셀이 중앙정렬됩니다.

hwp.HAction.Run("SelectCtrlFront")  # 표 컨트롤 선택
hwp.HAction.Run("ParagraphShapeAlignCenter")  # 중앙정렬
hwp.HAction.Run("CloseEx")  # 표 앞으로 빠져나가기
녹화_2024_09_22_20_05_42_584.gif

 

만약 특정 행이나 열만 (혹은 특정 셀만) 정렬하고 싶으시다면

이런 경우에는 직접 선택 및 이동 후 정렬을 실행해야 합니다.

 

예를 들어, 1행과 1열만 중앙정렬하고 싶으신 경우에는

image.png

다소 번거롭지만 아래와 같이 코드를 짜셔야 합니다.

# 표 생성 완료 직후 캐럿이 A1 셀에 있는 상태에서

hwp.HAction.Run("TableCellBlock")  # 셀 선택
hwp.HAction.Run("TableCellBlockExtend")  # 셀 선택 확장
hwp.HAction.Run("TableColEnd")  # 1행 전체 선택
hwp.HAction.Run("ParagraphShapeAlignCenter")  # 중앙정렬
hwp.HAction.Run("TableColBegin")  # A1셀로 돌아와서
hwp.HAction.Run("TableColPageDown")  # 1열 전체 선택
hwp.HAction.Run("ParagraphShapeAlignCenter")  # 중앙정렬
hwp.HAction.Run("CloseEx")  # 표 빠져나가기

이런 식으로요.

녹화_2024_09_22_20_19_17_641.gif

 

마지막으로,

treat_as_char가 True인 경우에는

표 안에서 CloseEx를 실행했을 때

표 우측이 아니라 좌측으로 빠져나오게 되므로 이 점을 유의하셔야 합니다.

BreakPara 실행시 표 위에 줄바꿈을 만들어버리거든요.

만약 현재 작성중인 표가 문서 끝에 있는 경우에는 코드 마지막의

hwp.HAction.Run("CloseEx")
hwp.HAction.Run("BreakPara")

대신에

hwp.HAction.Run("MoveDocEnd")
hwp.HAction.Run("BreakPara")

등의 코드를 사용하시는 걸 추천드립니다.

 

도움이 되었으면 좋겠습니다.

추가로 궁금한 부분은 댓글 남겨주세요.

 

정성봉님의 프로필 이미지
정성봉
질문자

엄청난! 도움이 되었습니다. 얼마전 네이버블로그에서 일상소식을 읽었는데 공감되었습니다.

저도 외동딸이 하나 있는데..... 건강해야죠.... 건강하세요! ㅎㅎㅎ
표와 셀의 폰트나 크기등을 적용하려면 어떻게 해야할까요?

일코님의 프로필 이미지
일코
지식공유자

셀의 폰트와 크기를 설정하는 코드는 다소 길지만 복잡하지는 않습니다.

먼저 제가 한 가지 추천드리기는, pyhwpx라는 모듈을 추가로 설치해서

사용해보시기를 바랍니다.

 

① pyhwpx로 폰트 변경하기 : hwp.set_font

아래 pyhwpx 코드는

한/글을 실행하고

4x4의 "글자처럼 취급"이 꺼진 표를 추가한 후

(모든 셀에 숫자 하나씩을 넣고)

표의 모든 셀 폰트를 휴먼명조, 크기는 20pt로 변경하는 예시코드입니다.

녹화_2024_09_23_23_23_25_743.gif
from pyhwpx import Hwp

hwp = Hwp()

hwp.create_table(4, 4, treat_as_char=False)

for i in range(16):
    hwp.insert_text(i)
    hwp.TableRightCell()

hwp.SelectCtrlFront()
hwp.set_font(FaceName="휴먼명조", Height=20)

기존 win32com으로 한/글을 실행했을 때와

동일한 명령어를 사용하실 수 있고,

몇 가지 도움이 되는 함수를 추가한 방식이어서

가급적 pyhwpx를 사용하시는 걸 추천드립니다^^

 

② 기존 win32com으로 제어하는 경우

기존 win32com 패키지로 조작하시려면

문자열을 입력하기 직전이나, 셀을 선택한 상태에서

아래 코드를 실행하시면 됩니다.

동일하게 "휴먼명조", "20pt"로 변경하는 예제입니다.

녹화_2024_09_23_23_32_21_979.gif
# hwp.SelectCtrlFront()  # 표 전체를 선택하는 경우
pset = hwp.CharShape 
pset.SetItem("Height", hwp.PointToHwpUnit(20))
pset.SetItem("FaceNameUser", "휴먼명조")
pset.SetItem("FaceNameSymbol", "휴먼명조")
pset.SetItem("FaceNameOther", "휴먼명조")
pset.SetItem("FaceNameJapanese", "휴먼명조")
pset.SetItem("FaceNameHanja", "휴먼명조")
pset.SetItem("FaceNameLatin", "휴먼명조")
pset.SetItem("FaceNameHangul", "휴먼명조")
hwp.CharShape = pset

 

※ 다만 TTF폰트가 아닌 HTF폰트(신명조, 중고딕 등)로 서체를 변경하는 경우에는

이렇게 단순하지 않으므로ㅜ pyhwpx의 set_font 메서드를 활용하시는 걸 추천드립니다.

 

도움이 되었으면 좋겠습니다.

행복한 하루 되세요!!

1

안녕하세요, 인프런 AI 인턴입니다. 성봉님.

표 또는 셀의 정렬 속성을 설정하는 방법에 대해 이미 제공된 답변 중 유사한 내용을 확인했습니다.

아래 두 게시물을 참고해 주세요:

  • 한글-파이썬 : 바탕쪽, 다단: 이 게시물에는 표의 셀 속성을 설정하는 예제 코드가 포함되어 있습니다. 특히 다단 설정과 관련된 부분에서 파라미터를 설정하는 방법을 참고하면 도움 됩니다.

  • 안녕하세요 표 생성이 막힙니다.: 이 게시물에서는 표를 생성하고 속성을 설정하는 방법에 대한 상세한 설명이 포함되어 있습니다. 특히, 표의 각 열 또는 행의 속성을 설정하는 부분을 참고하면 됩니다.

코드 예제 요약

  • hwp.HParameterSet.HTableCreation을 이용하여 표 생성 파라미터를 설정한 후, RowHeightColWidth를 설정하여 행과 열의 높이와 너비를 지정할 수 있습니다.
  • 셀 단위의 속성은 표가 생성된 후 셀을 선택한 다음 pset을 사용하여 셀 속성을 설정할 수 있습니다.

셀 정렬 속성 추가 예제

셀의 정렬 속성을 설정하려면 다음과 같은 방법을 참고하세요:

def set_table_cell_alignment(hwp, row, col, alignment="Center"):
    hwp.MoveToCell(row, col)
    pset = hwp.HParameterSet.HShapeObject
    hwp.HAction.GetDefault("CellAlign", pset.HSet)
    pset.AlignB = alignment  # "Center", "Left", "Right" 등의 값을 사용할 수 있습니다
    hwp.HAction.Execute("CellAlign", pset.HSet)

# 예제 용도
# 원하는 위치에 셀 정렬 설정
set_table_cell_alignment(hwp, 0, 0, "Center")  # 첫 번째 셀을 중앙 정렬로 설정

위 예제에서 MoveToCell은 원하는 위치의 셀로 이동하여 그 셀의 정렬 속성을 설정하게 됩니다.

위 게시물과 내용을 참고하시면서 코드 구현에 활용해 보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

일코님의 프로필 이미지
일코
지식공유자

음... 좋은 제안 감사합니다.

아직 구현이 되어 있는 기능은 아니지만^^;

추가하고 싶은 기능이네요.

 

정성봉님의 프로필 이미지
정성봉

작성한 질문수

질문하기