(예전 커뮤니티(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) 이것을 사용하면 조절이 안됩니다.