Win10과 Hwp2018에서 표크기와 셀크기 에러

(예전 커뮤니티(2016-2020) 사이트에서 옮겨온 글입니다: 번호 153)

작성자: k8816
날짜: 2019-12-24


Win10과 Hwp2014에서 표크기와 셀크기 잘 실행 되나 Win10과 Hwp2018에서 표크기와 셀크기 에러가 납니다. 무엇이 문제인지 알수 가 없습니다.

//표 만들기
void CHwpXCtrlFrameView::OnBnClickedButton37()
{
 // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

 const long h_unit = 283.4645;//hwp-unit 7200/1 inch(2.54cm) 1mm=283.4645

 m_cHwpCtrl.Clear(COleVariant((short)1));//0 - AskSave(내용변경시에 물어서) 1 - Discard(문서내용 버린다) 2 - SaveIfDirty(변경된 경우 저장 3 - 무조건 저장

 DHwpAction dact = m_cHwpCtrl.CreateAction(_T("PageSetup"));
 DHwpParameterSet dset = dact.CreateSet();
 dact.GetDefault(dset);

 dset.SetItem("ApplyTo", (COleVariant)(long)3);
 DHwpParameterSet  pdset = dset.CreateItemSet("PageDef", "PageDef");

 /*
 A4 -> 210 * 297  = 59,527 * 84,189
 B4 -> 257 * 364  = 72,850 * 103,181
 A3 -> 207 * 420  = 84,189 * 119,055
 */

 //편집용지 설정========================================
 int p_width[30];//배열로 준비하는것이 의문 스러움
 p_width[0] = (210 * h_unit) + 85;//210

 int p_height[30];//배열로 준비하는것이 의문 스러움
 p_height[0] = (297 * h_unit) + 141.7;

 int t_margin = 20 * h_unit;
 int b_margin = 17 * h_unit;
 int l_margin = 25 * h_unit;
 int r_margin = 25 * h_unit;
 int head_margin = 15 * h_unit;
 int tail_margin = 13 * h_unit;

 //A4
 pdset.SetItem(_T("PaperWidth"), (COleVariant)(long)p_width[0]);//용지 가로크기
 pdset.SetItem(_T("PaperHeight"), (COleVariant)(long)p_height[0]);//용지 세로크기

 pdset.SetItem(_T("Landscape"), (COleVariant)(long)0);//용지 방항 0->(좁게)

 pdset.SetItem(_T("TopMargin"), (COleVariant)(long)t_margin);// 위 여백(20) =>20
 pdset.SetItem(_T("BottomMargin"), (COleVariant)(long)b_margin);//아래 여백(17) =>15
 pdset.SetItem(_T("LeftMargin"), (COleVariant)(long)l_margin);//왼쪽 여백(25) =>30(8509)
 pdset.SetItem(_T("RightMargin"), (COleVariant)(long)r_margin);//오른쪽 여백(25)

 pdset.SetItem(_T("HeaderLen"), (COleVariant)(long)head_margin);//머리말 길이(17) =>15
 pdset.SetItem(_T("FooterLen"), (COleVariant)(long)tail_margin);//꼬리말 길이(13) =>15
 pdset.SetItem(_T("CutterLen"), (COleVariant)(long)0);//제본 여백

 dact.Execute(dset);
 //편집용지 설정========================================

 //겉의 표 만들기 만들어지면 Pos(2, 0, 0)========================================
 int rowsCnt = 1;
 int colsCnt = 1;

 // CDHwpAction
 dact = m_cHwpCtrl.CreateAction(_T("TableCreate"));
 dset = dact.CreateSet();

 CDHwpParameterArray rowsHeight = dset.CreateItemArray(_T("RowHeight"), rowsCnt);
 CDHwpParameterArray colsWidth = dset.CreateItemArray(_T("ColWidth"), colsCnt);
 dact.GetDefault(dset);

 dset.SetItem(_T("Rows"), CComVariant(rowsCnt));
 dset.SetItem(_T("Cols"), CComVariant(colsCnt));

 int m_width = 45150;//159.28*283.4645 =45150
 int m_height = 63286;// 223.26 * 283.4645 =63286
 colsWidth.SetItem(0, CComVariant(m_width));
 rowsHeight.SetItem(0, CComVariant(m_height));
 dact.Execute(dset);
 //만든 테이블의 첫번째 이름을 넣기
 m_cHwpCtrl.SetCurFieldName(_T("test"), CComVariant(1), CComVariant(0), CComVariant(0));
 //겉의 표 만들기 만들어지면 Pos(2, 0, 0)========================================

 CDHwpCtrlCode ctrlcode;
 ctrlcode = m_cHwpCtrl.GetParentCtrl();
 CDHwpParameterSet tbset = m_cHwpCtrl.CreateSet(_T("Table"));

 //표의 안 여백 결정
 tbset.SetItem(_T("CellMarginLeft"), OLELONG(0.5 * h_unit));// left
 tbset.SetItem(_T("CellMarginRight"), OLELONG(0.5 * h_unit));// right
 ctrlcode.SetProperties(tbset);
 //table에서 각 셀의 안쪽여백 1.8mm ->0.5mm로 변경 ===========

 ///*--셀의안쪽여백수정하기------------------
 CDHwpParameterSet tp;
 CDHwpParameterSet cp;
 tp = m_cHwpCtrl.CreateSet(_T("Table"));
 cp = tp.CreateItemSet(_T("Cell"), _T("Cell"));

 cp.SetItem(_T("MarginLeft"), OLELONG(0.5 * h_unit));// left
 cp.SetItem(_T("MarginRight"), OLELONG(0.5 * h_unit));// left
 tp.SetItem(_T("TreatAsChar"), OLELONG(1));//글자처럼 취급
 m_cHwpCtrl.SetCellShape(tp);
 ///*--셀의안쪽여백수정하기------------------

 //위치를 잡고서 SetPos(2,0,0)
 long list = 1 + 1, para = 0, pos = 0;
 m_cHwpCtrl.SetPos(list, para, pos);

 //한줄의 셀 8 칸을 가진 표를 만들기
 rowsCnt = 1;
 colsCnt = 8;

 dset.SetItem(_T("Rows"), CComVariant(rowsCnt));
 dset.SetItem(_T("Cols"), CComVariant(colsCnt));

 rowsHeight.SetItem(0, CComVariant(1644));//5.8* 283.4645= 1644

 colsWidth.SetItem(1, CComVariant(1729));//6.1* 283.4645= 1729
 colsWidth.SetItem(2, CComVariant(2919));//10.3* 283.4645= 2919
 colsWidth.SetItem(3, CComVariant(5727));//18.6* 283.4645= 5727
 colsWidth.SetItem(4, CComVariant(5727));//18.6* 283.4645= 5727
 colsWidth.SetItem(5, CComVariant(5727));//18.6* 283.4645= 5727
 colsWidth.SetItem(6, CComVariant(5727));//18.6* 283.4645= 5727
 colsWidth.SetItem(7, CComVariant(5727));//18.6* 283.4645= 5727
 colsWidth.SetItem(8, CComVariant(5727));//18.6* 283.4645= 5727

 dact.Execute(dset);
} 

밖의 표와 안의 표는 만들어 지는데 표안의 각 셀의 높이와 넓이가 안되고 평균치만으로 나타납니다.

댓글

smj0226 (2020.02.08)

“TableCreation” 관련 코드에서 CreateSet() 과 CreateItemArray() 사이에
HParameterSet.HTableCreation.WidthType = 2로 설정해주시면 될 것 같습니다.

smj0226 (2020.02.08)

저도 윈10(x64), 한/글2018, 파이썬 유저입니다.
기존 버전에는 WidthType을 설정하지 않아도 CreateItemArray로 각 셀 너비 설정이 가능했는데
2018버전에서는 WidthType = 2 설정을 해줘야 개별 셀 너비 등이 원하는 대로 작동하더라고요.

k8816 (2020.12.24)
//아래와 같이 하여 셀의 높이오 넓이 조절이 가능합니다
CDHwpCtrl table = m_cHwpCtrl.InsertCtrl(_T("tbl"), CComVariant(set));
//dact.Execute(dset) 이것을 사용하면 조절이 안됩니다.