델파이에서 OleObject 엑셀을 이용하면 인쇄물을 만드는데 유용하다.
복잡한 인쇄 양식을 미리 엑셀로 만들어 놓고 실제 DB 데이터가 들어갈 컬럼에 {NAME} 처럼 대체문자를 넣어 두면 컬럼명이 NAME 인
자료를 해당 셀에 대체문자와 바꾸기 하면 편리하다.
이때 사용하는 엑셀 VBA함수는 Replace 이다.
예를 들어 다음은 DB 테이블에 NAME컬럼에 "홍길동"이 입력되어 있다면
다음 코드는 '{NAME}' 문자열을 "홍길동" 으로 바꾸는 것이다.
xlSheet.Cells.Replace(What:='{NAME}',
Replacement:=aDataSet.FieldByName('NAME').DisplayText,
LookAt:=2,
SearchOrder:=1,
MatchCase:=False);
파라미터 값의 의미는 다음과 같다.
What 은 대체문자 -> '{NAME}'
Replacement 는 바뀌는 문자 -> "홍길동"
LookAt 값이 2는 부분일치 1은 전체일치,
SearchOrder 1은 행방향(정확성 및 속도향상됨) 2는 열방향,
MatchCase False는 대소문자구별안함
다음은 실전에서 해당 데이터셋의 필드수 만큼 돌면서 대체문자를 모두 DB 값으로 바꾸는 예이다.
중요한 것은 엑셀파일을 만들 때 대체문자를 필드명으로 만드는 것이다. {NAME} {MEMBER_NO} 등으로
for i := 0 to aDataSet.FieldCount - 1 do
begin
vWhat_str := '{' + aDataSet.Fields[i].FieldName + '}';
vRepl_str := aDataSet.Fields[i].DisplayText;
xlSheet.Cells.Replace(What := vWhat_str, Replacement := vRepl_str, LookAt := 2, SearchOrder := 1, MatchCase := False);
end;
(주의)
Replace함수가 바뀔 문자가 메모컬럼같은 400바이트가 넘는 자료는 바꾸는 과정에서 오류가 발생했다. 약 500바이트 정도에서 나는 것 같다.
아마도 Replace 함수의 한계인 것 같다.
그래서 Replace함수 대신 Find함수를 사용하여 해당 대체문자의 셀위치를 알아내어 직접 셀에 할당하는 방법도 사용해야할 것 같다.
/* 행전체 복사 후 다음 행에 "복사한 셀 삽입" 하기 */
어떤 행의 다양한 서식으로 구성되어 있는 경우 즉 가운데 정렬된 컬럼도 있고 오른쪽 정렬된 컬럼도 있고 셀 병합된 컬럼도 있는 경우
그냥 다음줄에 행 삽입하면 특정 행의 다양한 서식은 반영이 되지 않고 기본적인 컬럼으로 삽입된다.
그래서 특정 행 전체 를 복사하여 다음 행에 "복사한 셀 삽입" 을 하면 서식과 값이 모두 똑 같이 입력된다.
이때 옵션 xlShiftDown은 기존 행을 아래로 이동한다.
...
xlRange.OffSet[0, 0].EntireRow.Copy; // 행 전체 선택
xlRange.OffSet[1, 0].EntireRow.Insert(Shift := -4121); // 다음행에 "복사한 셀 삽입" xlShiftDown =-4321
...
(참고로)
r := xlRange.OffSet[1, 0].EntireRow.Address; //행주소 얻기
xlRange.OffSet[1, 0].Insert; // 다음행에 "셀을 아래로 밀기" 삽입
xlRange.OffSet[1, 0].EntireRow.Insert; // 다음행에 "행 전체" 삽입
xlRange.OffSet[0, 0].Copy(xlRange.OffSet[1, 0]); // 삽입한 셀에 대체문자 복사 붙여넣기 서식까지
'델파이' 카테고리의 다른 글
TMemo 전체선택(Select All) 단축키 Ctrl+ A 구현 (0) | 2016.11.17 |
---|---|
indy10 이메일 전송시 SSL TLS 관련 설정, SSL3_GET_RECORD 에러 (0) | 2016.11.08 |
콤보박스(TComboBox) 에서 마우스 휠 작동안하게 (스크롤 안되게) (0) | 2016.09.10 |
Table 과 직접 연결된 TDBGrid에서 값 수정후 엔터시 깔끔한 처리 (0) | 2016.09.10 |
템플릿 Templates 이용 코드 자동화 Ctrl + j (0) | 2016.09.03 |