델파이

델파이에서 엑셀양식 인쇄시 Replace함수(바꾸기), 행전체 복사한 셀 삽입

미스터몽키 2016. 9. 20. 17:04

델파이에서 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]);  // 삽입한 셀에 대체문자 복사 붙여넣기 서식까지