Q&A

  • dbgrid의 내용을 엑셀파일로 받는 빠른 컴포넌트없나요
dbgrid의 내용을 엑셀로 저장하기 위해 김영대님의 자료실에있는

dbgridxls는 컴포넌트를 사용했는데

레코드건수가 500건이 넘는 data에대해 export시간이 너무 많이걸리는데

조금 많은 data를 엑셀로 빠르게 받을수 있는 컴포넌트는 없습니까.......

아니면 엑셀이 아니고 *.cvs도 좋은데................

2  COMMENTS
  • Profile
    구창민 2000.01.25 11:25
    최수영 wrote:

    > dbgrid의 내용을 엑셀로 저장하기 위해 김영대님의 자료실에있는

    > dbgridxls는 컴포넌트를 사용했는데

    > 레코드건수가 500건이 넘는 data에대해 export시간이 너무 많이걸리는데

    > 조금 많은 data를 엑셀로 빠르게 받을수 있는 컴포넌트는 없습니까.......

    > 아니면 엑셀이 아니고 *.cvs도 좋은데................



    수영님 안녕하세요? 구창민입니다~~



    아래 코드로 원하시는 프로그램을 하나 만드셔셔

    사용해보세요.



    제가 테스트 해본 모듈중 가장 빠른 속도를 내는 소스였습니다.

    이 소스는 마소에서 발췌된 것이라고 합니다.



    먼저, uses절에 ComObj를 기술하시고.

    사용된 컴포넌트는 Query1, DataSource1, DBGrid1,

    Button1(오픈), Button2(변환), Button3(종료)입니다.



    바로 실행이 가능합니다.



    그럼, 즐거운 프로그래밍 되시길~~



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics,Controls,

    Forms, Dialogs, Grids, DBGrids, Db, DBTables, StdCtrls,

    ComObj;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    DataSource1: TDataSource;

    Query1: TQuery;

    DBGrid1: TDBGrid;

    Button2: TButton;

    Button3: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure FormShow(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    private

    { Private declarations }

    public

    {Public declarations }

    end;



    var

    Form1: TForm1;

    procedure ExcelConv(AQuery: TQuery);//엑셀변환 프로시져



    implementation



    {$R *.DFM}



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    with Query1 do begin

    DatabaseName := 'DBDEMOS';

    Close;

    SQL.Clear;

    SQL.Add('select * from Customer');

    SQL.Add('order by CustNo');

    Open; //엑셀로 변환할 데이타 오픈

    end;

    end;



    procedure TForm1.Button2Click(Sender: TObject);

    begin

    DataSource1.Enabled := False;

    ExcelConv(Query1); //엑셀변환 프로시져 호출

    DataSource1.Enabled := True;

    end;



    procedure TForm1.Button3Click(Sender: TObject);

    begin

    Close;

    end;



    procedure TForm1.FormShow(Sender: TObject);

    begin

    DataSource1.DataSet := Query1;

    DBGrid1.DataSource := DataSource1;

    end;



    procedure ExcelConv(AQuery: TQuery);

    var

    XL, XArr, XTitle: Variant;

    i, j, k: Integer;

    begin

    with AQuery do begin

    //타이틀 처리변수

    XTitle := VarArrayCreate([1, FieldCount], VarVariant);

    //데이타 처리변수

    XArr := VarArrayCreate([1, 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 <= FieldCount do begin

    XTitle[i] := Fields[i-1].FieldName;

    Inc(i);

    end;

    //타이틀처리

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



    First;

    while Not EOF do begin

    j := 1;

    while j <= FieldCount do begin

    if Fields[j-1].DataType = ftString then

    XArr[j] := '''' + Fields[j-1].Value

    else

    XArr[j] := Fields[j-1].Value;

    Inc(j);

    end;

    //셀에 값을 넣는다.

    XL.Range['A' + IntToStr(k+1),

    CHR(64 + FieldCount) + IntToStr(k+1)].Value := XArr;

    Next;

    Inc(k);

    end;



    //셀 크기 조정

    XL.Range['A1', CHR(64 + FieldCount) + IntToStr(k)].Select;

    XL.Selection.Columns.AutoFit;

    XL.Range['A1', 'A1'].Select;

    First;

    end;

    end;

    end.

  • Profile
    최수영 2000.01.25 19:42
    창민님 정말 고맙습니다........

    매번 많은 도움을 받고 있습니다.........

    제가 워낙 델파이는 초보라.........