Q&A

  • 스트링그리드에서 excel로 저장 정말 궁금
전 delphi로 주로 db그리두만 이용해오다가

이번에 스트링 그리드를 쓰려하는데

excel로 저장하는 방법(컴포넌트를 이용하든지, 아니면 ole를 이용하든지)

을 알고 싶네요...

정말 잘 알고 있는분 저에게 한수 부탁 드립니다..

이왕이면 자세하게...



가르쳐 주신분은 아마 복많이 받으 실꺼예요,,,

그럼 20000...

2  COMMENTS
  • Profile
    류성호 1999.06.22 05:24
    홍희석 께서 말씀하시기를...

    > 전 delphi로 주로 db그리두만 이용해오다가

    > 이번에 스트링 그리드를 쓰려하는데

    > excel로 저장하는 방법(컴포넌트를 이용하든지, 아니면 ole를 이용하든지)

    > 을 알고 싶네요...

    > 정말 잘 알고 있는분 저에게 한수 부탁 드립니다..

    > 이왕이면 자세하게...

    >

    > 가르쳐 주신분은 아마 복많이 받으 실꺼예요,,,

    > 그럼 20000...



    당연한 이야기 겠지만 엑셀이 설치되어 있어야 합니다.



    아래의 예제는 Microsoft의 OLE 자동화 기술을 이용한 것이고,

    자동화 기술을 이용해서 Word, Excel, Access를 다루고 싶다면

    Microsoft에 Web사이트에 방문하시면 VB로 된 예제가

    아주 잘 나와 있습니다.



    자동화기술은 스크립 방식의 언어(VBScript)에서도 다눌수 있는 기술이므로

    VB용 예제를 보시더라도 Delphi로 싶게 다꿀 수 있을것니다.



    사이트 소개 http://cafe.hanmail.net/delphi



    <예제>



    --->

    1. StringGrid 예제





    반드시 Uses절 ComObj라고 써주어야 합니다.



    procedure TshGridX.run_excel;

    var

    XL, XArr: Variant;

    i, j: Integer;

    begin

    //데이타 처리변수

    XArr := VarArrayCreate([1, StringGrid1.ColCount], VarVariant);



    try

    //엑셀을 실행

    XL := CreateOLEObject('Excel.Application');

    except

    MessageDlg('Excel이 설치되어 있지 않습니다.', MtWarning, [mbok], 0);

    Exit;

    end;



    XL.WorkBooks.Add; //새로운 페이지 생성

    XL.Visible := True;



    for i := 0 to StringGrid1.RowCount - 1 do begin

    for j := 0 to StringGrid1.ColCount - 1 do begin

    XArr[j+1] := StringGrid1.Cells[j,i];

    end;



    //셀에 값을 넣는다.

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



    end;



    //셀 크기 조정

    XL.Range['A1', CHR(64 + StringGrid1.ColCount) + IntToStr(i+1)].Select;

    XL.Selection.Columns.AutoFit;

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

    end;





    --->

    2. 데이타베이스 바이딩 예제



    procedure TMDIChild.BitBtn1Click(Sender: TObject);

    var

    XL, XArr, XTitle: Variant;

    i, j, k: Integer;

    begin

    //타이틀 처리변수

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

    //데이타 처리변수

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

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

    Inc(i);

    end;

    //타이틀처리

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

    DBModule.Query3.First;



    while Not DBModule.Query3.EOF do begin

    j := 1;

    while j <= DBModule.Query3.FieldCount do begin

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

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

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

    Inc(j);

    end;

    //셀에 값을 넣는다.

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



    DBModule.Query3.Next;

    Inc(k);

    end;



    //셀 크기 조정

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

    XL.Selection.Columns.AutoFit;

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

    end;

  • Profile
    franco97 1999.06.22 22:43
    스트링그리드의 한필드에 문자타입의 10자리 코드가 (ex: 0000012345,0000078901,...) 들어있습니다..



    그런데 이걸 엑셀로 보내면(한글오피스97버젼) 0000012345 -> 12345, 0000078901 -> 78901 이렇게



    변환되어 자리를 지키고 있더라구요.. 참 기가막혀서...



    엑셀이 너무 똑똑하여 Default로 문자코드를 숫자만 있다고 숫자로 바꾸어 버리는 이런 현상을 막을 수는



    없는지요.. 정말 답답하더라구요... 그럼...