표의 행열 정보 얻는 방법 문의

안녕하세요.

C#에서 각 표에 1,000단위 쉼표 구분을 넣는 코드를 아래와 같이 작성하였습니다.

            HwpCtrlCode currctrl = (HwpCtrlCode)hwpCtrl.HeadCtrl;
            HwpCtrlCode nextctrl = null;
            
            while (currctrl != null)
            {
                if( currctrl.ctrlid == "tbl" )
                {

                    HwpParameterSet tableParaSet = (HwpParameterSet)currctrl.GetAnchorPos(0);

                    int list = (int)(uint)tableParaSet.Item("List");
                    int para = (int)(uint)tableParaSet.Item("Para");
                    int pos = (int)(uint)tableParaSet.Item("Pos");

                    hwpCtrl.SetPos(list, para, pos);
                    hwpCtrl.Run("SelectCtrlReverse");

                    hwpCtrl.Run("TableCellBlock");
                    hwpCtrl.Run("TableCellBlockExtend");
                    hwpCtrl.Run("TableCellBlockExtend");

                    hwpCtrl.Run("TableInsertComma");


                }

                nextctrl = (HwpCtrlCode)currctrl.Next;

                if (nextctrl == null)
                    break;

                currctrl = nextctrl;
            }
        }

잘 작동하고 있는데, 테이블 중에 행과 열이 1x1로 되어 있는 테이블에
대해서는 적용을 안하고 싶어서 현재 테이블의 행과 열의 수를 얻을 수 있는
방법이 있는지 문의 드립니다.

감사합니다.

1개의 좋아요

표의 행렬 정보를 한 번에 알 수 있는 방법이 있으면 좋겠는데…
없는 것 같네요…

두 가지 방법으로 생각해 봤습니다. (참고로 vb.net 코드 입니다.)

  1. 표의 셀을 돌면서 표의 행/열 정보를 얻는 방법.
        '행번호와 열번호를 각각 얻는다. (정규식을 이용)
        Dim myRegex1 As New Regex("[A-Z]") 'Col
        Dim myRegex2 As New Regex("[0-9]") 'Row

        '찾아가기용 변수
        Dim myActGoto As HAction = myHwp.HAction
        Dim myHGotoE As HGotoE = myHwp.HParameterSet.HGotoE
        Dim myHSet As HSet = myHGotoE.HSet
        myActGoto.GetDefault("Goto", myHSet)
        myHSet.SetItem("DialogResult", 55) '표 찾아가기
        myHGotoE.SetSelectionIndex = 5

        Dim myPos As IDHwpParameterSet        
        Dim myCurrentCellList As Short '셀을 옮겨 다니면서 현재 셀의 리스트를 저장한다.

        '기타 필요한 변수
        Dim myR As New List(Of String) '행
        Dim myC As New List(Of String) '열
        Dim myR2 As New List(Of String) '행 (중복제거)
        Dim myC2 As New List(Of String) '열 (중복제거)
        Dim rMax As String, cMax As String

        Dim str As String
        Dim ctr As String = "" 'KeyIndicator의 매개변수, 셀의 주소 정보를 위한 변수

        myHwp.SetMessageBoxMode(&H20000) '캐럿 이후에 표가 없으면 문서 처음부터 찾을까요? 메시지 박스가 뜬다. 메시지 박스 차단용

        myPos = myHwp.GetPosBySet() '현재 캐럿의 위치 정보
        Select Case myPos.Item("List")
            Case 0 '캐럿이 본문에 있으면 캐럿 이후 첫번째 표가 대상임
                myActGoto.Execute("Goto", myHSet)
            Case Else '캐럿이 표의 셀에 있으면 해당 표가 대상임
                myHwp.Run("CloseEx")
        End Select
        myHwp.Run("MoveRight") '표 안으로 들어감.
        myHwp.Run("TableCellBlock") '셀 블럭 선택

        '각 셀을 돌면서 셀의 주소와 필요한 정보를 얻는다.
        Do
            myPos = myHwp.GetPosBySet()
            myCurrentCellList = myPos.Item("List")

            myHwp.KeyIndicator(Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ctr)
            str = Mid(ctr, 2, InStr(ctr, ")") - 2)
            myC.Add(myRegex2.Replace(str, "")) '행렬에서 숫자를 지우면 문자(열↓)만 남는다. A1, B1, C1, ...에서 A, B, C, ... 에 해당한다.
            myR.Add(myRegex1.Replace(str, "")) '행렬에서 문자를 지우면 숫자(행→)만 남는다. A1, A2, A3, ...에서 1, 2, 3, ... 에 해당한다.

            myHwp.Run("TableRightCell")
            myPos = myHwp.GetPosBySet()
            If myCurrentCellList = myPos.Item("List") Then
                myHwp.Run("CloseEx")
                Exit Do
            End If
        Loop
        myR2 = myR.Distinct.ToList
        myC2 = myC.Distinct.ToList

        rMax = myR2.Max
        cMax = (Asc(myC2.Max) - 64).ToString

        MsgBox("이 표는 " + rMax + "행 " + cMax + "열 입니다.")
  1. 표를 XML 형식으로 블록 저장하여 XML 파일의 정보를 이용하는 방법
'찾아가기용 변수
Dim myActGoto As HAction = myHwp.HAction
Dim myHGotoE As HGotoE = myHwp.HParameterSet.HGotoE
Dim myHSet As HSet = myHGotoE.HSet
myHSet.SetItem("DialogResult", 55) '표 찾아가기
myHGotoE.SetSelectionIndex = 5

'캐럿 위치 변수
Dim myPos As IDHwpParameterSet

'블록 저장용 변수
Dim myActFileSave As HAction = myHwp.HAction
Dim myHFileOpenSave As HFileOpenSave = myHwp.HParameterSet.HFileOpenSave
Dim myHFileOpenSaveHSet As HSet = myHFileOpenSave.HSet

'XML 관련 변수
Dim myXML As New XmlDocument
Dim myNodeList As XmlNodeList
Dim myXMLName As String

'기타 필요한 변수
Dim myR As New List(Of String)
Dim myC As New List(Of String)

'블록 저장 할 임시 폴더 생성
If Not Directory.Exists("C:\HwpTableTemp") Then Directory.CreateDirectory("C:\HwpTableTemp")

myHwp.SetMessageBoxMode(&H20000) '캐럿 이후에 표가 없으면 문서 처음부터 찾을까요? 메시지 박스가 뜬다. 메시지 박스 차단용

myPos = myHwp.GetPosBySet() '현재 캐럿의 위치 정보
Select Case myPos.Item("List")
    Case 0 '캐럿이 본문에 있으면 캐럿 이후의 첫번째 표로 간다.
        myActGoto.Execute("Goto", myHSet)
    Case Else '캐럿이 표 안에 있으면 Shift + ESC를 눌러 표를 빠져나온다.
        myHwp.Run("CloseEx")
End Select

'표 블록 선택
myHwp.Run("MoveSelParaEnd")

'표를 블럭 선택 후 XML로 저장
myXMLName = "C:\HwpTableTemp\tmp" & DateTime.Now.ToString(" yyMMdd HHmmssff") & ".xml"
With myHFileOpenSave
    .filename = myXMLName
    .Format = "XML"
    .Attributes = 1
End With
myActFileSave.Execute("FileSaveBlock_S", myHFileOpenSaveHSet)
myHwp.Run("MoveLineBegin")

myXML.Load(myXMLName)
myNodeList = myXML.GetElementsByTagName("CELL")

For Each myNode As XmlNode In myNodeList
    myC.Add(CInt(myNode.Attributes("ColAddr").Value))
    myR.Add(myNode.Attributes("RowAddr").Value)
Next

'XML 파일을 저장했던 임시 폴더 삭제.
If Directory.Exists("C:\HwpTableTemp") Then Directory.Delete("C:\HwpTableTemp", True)

MsgBox("이 표는 " + (CInt(myR.Max) + 1).ToString + "행 " + (CInt(myC.Max) + 1).ToString + "열 입니다.")
3개의 좋아요

안녕하세요 ^^
KeyIndicator를 이용해 셀의 좌표를 알수있습니다.
자세한 내용은 아래 참고하시면 좋을것 같습니다.

셀은 선택한후 TableCellBlockExtend를 세번 실행하면
처음 첫번째 셀 선택
두번째 전체 셀 선택
세번째는 마지막 셀 선택이 됩니다.

마지막 셀 선택이 된후에 KeyIndicator를 통해 마지막 셀의 위치를 확인해보면 행열의 크기를 유추할수 있습니다.

감사합니다 ^^

HAction.Run("TableCellBlockExtend");
HAction.Run("TableCellBlockExtend");
HAction.Run("TableCellBlockExtend");
3개의 좋아요

이렇게 별도로 함수까지 작성해주셔서 감사합니다.

1개의 좋아요

감사합니다. 큰 도움이 될 거 같습니다.

1개의 좋아요