Q&A

  • DB그리드의 내용을 Excel로... 그러나 에러가???
안녕하세요...
DB 그리드의 결과를 Excel로 보려고 하는데 자꾸만 에러가 납니다...
Variant array index out of bounds에러가 나는데 왜 나는지를 모르겠어요...
소스는 다음과 같습니다... 좀 봐주세요... 에러가 나는 걸루 추정되는 부분은 소스 중간에 주석으로 표시해 놓았습니다. 그럼, 즐거운 하루 보내시구요...
멋진 해결책을 기다리겠습니다...


procedure ExcelExport(DBGrid: TDBGrid);
var
  XL, XArr, XTitle : Variant;
  i, j, k: Integer;
  Cnt : Integer;
  iFieldCount : Integer;
begin
  Screen.Cursor := crHourGlass;

  Cnt := 1;
  XTitle := VarArrayCreate([1, DBGrid.FieldCount], VarVariant); //타이틀 처리변수
  XArr := VarArrayCreate([1, DBGrid.DataSource.DataSet.RecordCount], VarVariant);   //데이타 처리변수

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

  XL.WorkBooks.Add; //새로운 페이지 생성
  i := 1;
  k := 1;
  iFieldCount := DBGrid.FieldCount;

  while i <= iFieldCount do begin
    XTitle[i] := DBGrid.Columns.Items[i-1].Title.Caption;
    Inc(i);
  end;

  XL.Range['A1', CHR(64 + DBGrid.FieldCount) + '1'].Value := XTitle; //타이틀처리
  XL.Range['A1', CHR(64 + DBGrid.FieldCount) + '1'].Font.Bold := True;
  XL.Range['A1', CHR(64 + DBGrid.FieldCount) + '1'].Interior.Color := ClYellow;
  XL.Range['A1', CHR(64 + DBGrid.FieldCount) + '1'].Borders.Color := ClBlack;

  DBGrid.DataSource.DataSet.First;
  Try
    DBGrid.DataSource.DataSet.DisableControls;
    for i := 0 to DBGrid.DataSource.DataSet.RecordCount - 1 do begin
      //바로 이 for문에서 에러가 나는 것 같습니다...
      for j := 1 to iFieldCount do begin
        if  DBGrid.Fields[j].DataType = ftString then begin
          XArr[j+1] :=  '''' + DBGrid.Fields[j].AsVariant;
        end
        else if  DBGrid.Fields[j].DataType = ftFloat then begin
          XArr[j+1] :=  FormatFloat('#,##0', DBGrid.Fields[j].AsVariant);
        end
        else begin
          XArr[j+1] := DBGrid.Fields[j].AsVariant;
        end;
      end;

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

      
      DBGrid.DataSource.DataSet.Next;

      
      Inc(Cnt);
      Inc(k);
    end;
  Finally
    DBGrid.DataSource.DataSet.EnableControls;
  end;

  DBGrid.DataSource.DataSet.First;
  //셀 크기 조정
  XL.Range['A1', CHR(64 + DBGrid.FieldCount) + IntToStr(k)].Font.Size := 9;
  XL.Range['A1', CHR(64 + DBGrid.FieldCount) + IntToStr(k)].Font.Name := 'Times New Roman';
  XL.Range['A1', CHR(64 + DBGrid.FieldCount) + IntToStr(k)].Borders.Color := ClBlack;
  XL.Range['A1', CHR(64 + DBGrid.FieldCount) + IntToStr(k)].Select;
  XL.Selection.Columns.AutoFit;
  Screen.Cursor := crDefault;
  XL.Visible := true ;
  XL.DisplayAlerts := true ;
  XL.Range['A1', 'A1'].Select;

end;
0  COMMENTS