Q&A

  • DB Grid의 자료를 Excel로 옮길 때의 문제점에 대하여???
안녕하세요... 6108번의 질문을 올린 사람입니다... 그 문제는 해결했구요...
근데 문제가 발생했습니다.

1) 자료가 몇 십건 정도를 되는 걸 엑셀로 옮기면 별 문제가 없는데, 한 3000건 정도 되는 것을 옮겼더니 Invalid Variant Type Conversion이라는 에러가 발생하네요...
2) 그리구, 엑셀로 보여줄 때 내부적으로 엑셀을 완벽하게 만들어서 한꺼번에 보여지는 것 같아요. 저는 배치되는 순서대로 그냥 보여졌으면 좋겠는데... 그니까 에러가 나면 에러가 나는 곳까지는 보여졌으면 좋겠는데 한꺼번에 보여주는 체계이다 보니깐 중간에 에러가 나도 아예 하나도 볼 수 없는 거죠...
그럼, 소스를 올립니다... 부탁드립니다...

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

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

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

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

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

  ShowMessage('aaa');

  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;

  ShowMessage('bbb');

  DBGrid.DataSource.DataSet.First;
  try
    DBGrid.DataSource.DataSet.DisableControls;
    for i := 0 to DBGrid.DataSource.DataSet.RecordCount - 1 do begin
      for j := 0 to DBGrid.FieldCount - 1 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;

      strItemKind := DBGrid.DataSource.DataSet.FieldByName(strItemKindName).AsString;
      DBGrid.DataSource.DataSet.Next;

      if strItemKind = '1' then
        XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClBlack
      else if strItemKind = '2' then
        XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClRed
      else if strItemKind = '3' then
        XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClBlue
      else if strItemKind = '4' then
        XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClBlue
      else
        XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClBlack;

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

  ShowMessage('ccc');

  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;
1  COMMENTS
  • Profile
    너구리 2004.01.07 20:51
    먼저 첫번째 질문을 보면

    3천건이라 해서 에러가 난건 아닌것 같습니다..

    데이타 중에 어떤 값이 문제가 있는것 같습니다.

    XArr[j+1] :=  '''' + DBGrid.Fields[j].AsVariant;

    이곳에서 문제가 발생하지 않나 싶습니다...

    저문장 전에 값을 넣어두고 어떤 레코드에서 에러가 나는지 확인을 하시면

    될거 같구요..

    두번째 질문은.... 글