본문 바로가기

Development/Delphi

TDataSet(TQuery, TTable) 엑셀로 저장하기

// DataSet 을 엑셀로 내보내기
procedure TfrmMain.exportToExcel(DataSet: TDataSet);
var
  XL, XArr, XTitle: Variant;
  i, j, k: Integer;
  FixedCol: String;
begin
  try
    //타이틀 처리변수
    XTitle := VarArrayCreate([1, DataSet.FieldCount], VarVariant);
    //데이타 처리변수
    XArr := VarArrayCreate([1, DataSet.FieldCount], VarVariant);
    try
      //엑셀을 실행
      XL := CreateOLEObject('Excel.Application');
    except
      MessageDlg('Excel이 설치되어 있지 않습니다.', MtWarning, [mbok], 0);
      Exit;
    end;

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

    while i <= DataSet.FieldCount do begin
      XTitle[i] := DataSet.Fields[i-1].DisplayName;
      Inc(i);
    end;

    //타이틀처리
    // 엑셀 Range['top&left', 'bottom&right'] 형식, 사각형 그린다 : 좌상단, 우하단
    if DataSet.FieldCount > 26 then
      FixedCol := CHR(64 + DataSet.FieldCount div 26)+CHR(64 + DataSet.FieldCount mod 26)
    else FixedCol := CHR(64 + DataSet.FieldCount);
    XL.Range['A1', FixedCol + '1'].Value := XTitle;

    DataSet.First;
    while Not DataSet.EOF do
    begin
      j := 1;
      while j <= DataSet.FieldCount do begin
        XArr[j] := DataSet.Fields[j-1].DisplayText;
        Inc(j);
      end;

      //셀에 값을 넣는다.
      XL.Range['A' + IntToStr(k+1), FixedCol + IntToStr(k+1)].Value := XArr;

      DataSet.Next;
      Inc(k);
    end;

    //셀 크기 조정
    XL.Range['A1', FixedCol + IntToStr(k)].Select;
    XL.Selection.Columns.AutoFit;
  except
    on E: Exception do
    begin
      FDQExam.Close;
      MessageDlg ('엑셀저장 오류 입니다.'+#13+E.Message, mtError, [mbOk], 0);
    end;
  end;
end;


// 엑셀저장 버튼 클릭
procedure TfrmMain.BtnExportExcelClick(Sender: TObject);
var
  locate: Integer;
begin
  FDQExam.DisableControls;
  locate := FDQExam.FieldByName('IDX').AsInteger;
  try
    exportToExcel(FDQExam);
  finally
    FDQExam.Locate('IDX',VarArrayOf([locate]),[loCaseInsensitive]);
    FDQExam.EnableControls;
  end;
end;