본문 바로가기
아래아한글 자동화/python+hwp 중급

[커뮤니티질문] HWP문서의 특정 셀에 색을 넣고 싶은데요.

by 일코 2021. 1. 9.

 

오랜만에 한글과컴퓨터 개발자 커뮤니티에 들어가 보았다.

개발자 커뮤니티는 아래아한글 정품유저에 한해, 공개된 질의응답 및 노하우 공유 게시판이다. 예전에는 한컴 개발자 분이 직접 들르셔서 개발진 입장에서 상세한 답변을 거의 모든 질문에 남겨주셨는데, 현재는 유저끼리 종종 질답을 남기는 아주 소소한 게시판이 되었다..

https://www.hancom.com/board/devcommList.do?gnb0=25&gnb1=81

 

제일 최근에 올라온 질문을 클릭해보니,

 

// c#에서 선택된 셀에 색을 넣고 싶은데요.

var pvact = (HWPCONTROLLib.DHwpAction)axHwpCtrl1.CreateAction("BorderFill");
var pvset = (HWPCONTROLLib.DHwpParameterSet)pvact.CreateSet();
pvset.SetItem("Type",1);
pvset.SetItem("WinBrushFaceColor", 0x00ffff00);
pvact.Execute(pvset);

// 아무리 노력해도 해결하지 못했습니다. 고수님들 부탁드립니다..

 

필자도 한/글 스크립트 오류를 만날 때마다 해결하기 난감했는데,
가장 간편하게 이런 종류의 오류를 해결하는 방법은 바로,

 

"스크립트매크로로 재현해보기"이다.

왜냐면, 위의 경우처럼 API매뉴얼만 읽고 코드를 적게 되면
필수 파라미터를 빼먹는 경우가 있기 때문이다. 한/글 스크립트는 오류메시지가 친절하지 않다.
API매뉴얼에도 필수로 넣어야 하는 파라미터가 무엇인지 상세하게 기술되어 있지 않으며, 
그래서 모든 파라미터를 전부 집어넣고(SetItem) 하나씩 빼보면서 불필요한 파라미터를 제외하는 방법으로
최적화를 하면서 코드를 짧게 만드는 과정이 필요하다. (귀찮으면 그냥 길게 남겨두든가.)

 

위 예제의 경우는..

pvset.SetItem("WinBrushHatchColor")가 빠져 있기 때문에 나는 오류.
오류라기보다는 반응이 없다. 색이 입혀지지 않는다. 해치 설정값이 필수이기 때문.

참고로 위의 0x00ffff00는 RGB컬러로 노란색을 뜻함.
0x00 뒤 여섯자리가 두 자리씩 각각 Red, Green, Blue이고, 빨강초록이 최대니까 "노랑"이군? 식이다.
hwp.RGBColor(255,255,0)을 넣어도 되고, 0x00ffff00을 10진수로 변환한 16,776,960으로도 입력가능하다.
하여튼,

 


 

오류를 재현해보기 위해 스크립트매크로 녹화를 해보자.

스크립트매크로 녹화기능을 사용해서 코드를 추출해 보았다.

추출한 스크립트는 아래와 같다.

function OnScriptMacro_script5()
{
	HAction.Run("TableCellBlock");
	HAction.GetDefault("CellFill", HParameterSet.HCellBorderFill.HSet);
	with (HParameterSet.HCellBorderFill)
	{
		FillAttr.Type = BrushType("NullBrush|WinBrush");
		FillAttr.WinBrushFaceColor = RGBColor(255, 0, 0);
		FillAttr.WinBrushHatchColor = RGBColor(153, 153, 153);
		FillAttr.WinBrushFaceStyle = HatchStyle("None");
		FillAttr.WindowsBrush = 1;
	}
	HAction.Execute("CellFill", HParameterSet.HCellBorderFill.HSet);
}

질문 남겨주신 분처럼 9~10번 라인만 빼고 스크립트를 실행해보면,

색이 적용되지 않는다.

 


 

문제의 원인을 고쳐보자.

필자는 파이썬 유저라서, C#으로 한/글을 다루지는 않는다.
다만, API명령어 사용법은 대부분 동일하기 때문에 코드를 한 번 수정해보자면 아래와 같다.
두 줄을 추가했다.

// 기존코드
var pvact = (HWPCONTROLLib.DHwpAction)axHwpCtrl1.CreateAction("BorderFill");
           var pvset = (HWPCONTROLLib.DHwpParameterSet)pvact.CreateSet();
           pvset.SetItem("Type",1);
           pvset.SetItem("WinBrushFaceColor", 0x00ffff00);
           pvact.Execute(pvset);

// 변경코드
var pvact = (HWPCONTROLLib.DHwpAction)axHwpCtrl1.CreateAction("BorderFill");  // CellFill로도 가능
           var pvset = (HWPCONTROLLib.DHwpParameterSet)pvact.CreateSet();
           pvset.SetItem("Type",1);
           pvset.SetItem("WinBrushFaceColor", 0x00ffff00);
           pvset.SetItem("WinBrushHatchColor", 0x00999999);  // 추가. RGBColor(153,153,153)
           pvset.SetItem("WinBrushHatchStyle", -1);  // 추가. HatchStyle("None")
           pvact.Execute(pvset);

부디 도움이 되기를 바라며.

 

참고로

위 메서드를 이용하면, 한/글로 이런 모자이크 작품(?)을 그리는 것도 가능하다.

5000셀의 표라, 사람이 채우기는 힘들다. 파이썬으로 했다.

셀채우는 시간이 상당히 걸리길래... 녹화해서 유튜브에 올려버렸다. 콘텐츠 없으면 틈틈이 이런 거라도!

초반에 파이썬 코드 1초쯤 나오고, 그 뒤로는 셀 채우기 말고 아무 내용이 없다. 1분짜리 잔잔한 음악 감상하시길.

 

댓글