Q&A

  • DBGrid를 excel로 변환하려고 하는데 OLE에러가 나네요
아래 두 군대에서 에러가 나네요

       XL.Range['A1', CHR(64 + nFieldCnt) + '1'].Value := XTitle;

       XL.Range['A' + IntToStr(k+1), CHR(64 + nFieldCnt) + IntToStr(k+1)].Value := XArr;


OLE 에러가요
이런 경우에 uses comobj를 추가하면 된다는 글이 있던데
추가했는데도 똑같은 OLE에러가 나는데
어떻게 해야하나요?
잘 되는 다른 것들 소스를 보면 똑같은데 왜 이것만 안되는지...
고수님들 능력을 보여주세요~~~

----------------

procedure TGroupRFrm.ExcelConv(cTitle:String);
var
    XL, XArr, XTitle : Variant;
    i,j, k : Integer;
    title : string;
    nFieldCnt : integer;
begin
//   nFieldCnt := StringGrid1.ColCount;

    nFieldCnt := StoreQuery.FieldCount ;

    with DBGrid1 do begin
       //타이틀 처리변수
       XTitle := VarArrayCreate([1,nFieldCnt], VarVariant);
       //데이타 처리변수
       XArr := VarArrayCreate([1, nFieldCnt], VarVariant);

       try
         XL := GetActiveOLEObject('Excel.Application');
       except
         on E: EOleSysError do begin
           try
             XL := CreateOLEObject('Excel.Application');          //엑셀을 실행
           except
             MessageDlg('Excel이 설치되어 있지 않습니다.', MtWarning, [mbok], 0);
             Exit;
           end;
         end;
       end;

       title := cTitle;
       XL.WorkBooks.Add; //새로운 페이지 생성
       XL.WorkSheets[1].Name := Title;
       XL.Visible := False;

       k := 1;

       for i := 1 to nFieldCnt do begin
//            XTitle[i]  :=  Cells[i-1,0];
          XTitle[i]  :=  StoreQuery.Fields[i-1].FieldName;
       end;

       //타이틀처리
       XL.Range['A1', CHR(64 + nFieldCnt) + '1'].Value := XTitle;

       try
          StoreQuery.First;
          i := 0;
          while i < StoreQuery.RecordCount  do begin
            j := 1;
            while j <= nFieldCnt do begin
               if StoreQuery.Fields[j-1].DataType = ftString then
                    XArr[j] := '''' + StoreQuery.Fields[j-1].Value
               else
                    XArr[j] := StoreQuery.Fields[j-1].Value;
               Inc(j);
            end;
            //셀에 값을 넣는다.
            XL.Range['A' + IntToStr(k+1), CHR(64 + nFieldCnt) + IntToStr(k+1)].Value := XArr;
            StoreQuery.Next;
            Inc(k);
          end;
           //셀 크기 조정
          XL.Range['A1', CHR(64 + nFieldCnt) + IntToStr(k)].Select;
          XL.Selection.Columns.AutoFit;
          XL.Range['A1', 'A1'].Select;
       finally
          XL.Visible := True;
          XL := UnAssigned;   // 엑셀 프로세스에서 할당 해제
       end;
    end;
end;
1  COMMENTS
  • Profile
    깨구락지 2003.01.22 20:14
    아마도 필드가 26개이상일경우에 에러가나는것 같군요.
    컬럼의 순서가 A,B,C...Z,AA,AB.. 이런식으로 되므로 필드의 갯수에 따라 만들어주셔야 합니다.
    저는 이렇게 해결했습니다.
    function IntToCellName(const Number:integer):string;
    var
      share,remainder:integer;
    begin
      if (Number<=0)or(Number>256) then begin
        result:='';
        MessageDlg('숫자가 범위를 초과하였습니다.'#13'범위는 0<숫자<=256 입니다.',mtError,[mbOK],0);
        exit
      end;
      if Number<=26 then
        Result:=chr(Number+64)
      else begin
        share:=Number div 26;
        Remainder:=Number mod 26;
        if Remainder=0 then
          result:=chr(share+64-1)+'Z'
        else
          result:=chr(share+64)+chr(Remainder+64);
      end;
    end;