Q&A

  • DBGrid(Query)의 내용을 Excel로 변환시 속도가 넘 느려요
^^
DBGrid(Query)의 내용을 Excel로 변환하는데 속도가 넘 느린것 같아요.
어찌 속도를 빠르게 할 방법은 없는건가요?
참고로 Query의 RecordCount는 기본적으로10,000개 정도 되고 FieldCount는 14개 입니다. 그러니 총 데이터를 엑세스하는 횟수는 10000 * 14 = 140,000번이네요. 컴터가 노트북인데요 터지기 일보직전이예요.


        v := CreateOLEObject('Excel.Application');
        v.workBooks.Add;

        Query2.first;
        for i := 1 to Query2.RecordCount do
        begin
                for j := 1 to DBGrid1.FieldCount do
                begin
                        v.Cells[i+1,j].Value := Query2.Fields[j-1].AsString;
                end;

                Query2.Next;
        end;

        v.Visible := True;
2  COMMENTS
  • Profile
    최석기 2002.04.08 23:35
    예전에 제가 테스트 해보니까 Excel을 Com 객체로 생성해서 사용하는 경우랑 비교할때 Com 객체 없이 엑셀 파일을 생성하는 방법이 더 빠르더군요..

    다음은 엑셀이 않 깔려 있어두 엑셀 파일을 만드는 코드거든요.

    예전에 제가 테스트했던 코드는 못 찾겠구요 이거로 함 테스트 해보시져.

    참고 하시고 유용하게 사용하세요.



    const
    CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0);
    CXlsEof: array[0..1] of Word = ($0A, 00);
    CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
    CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
    CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure XlsBeginStream(XlsStream: TStream; const BuildNumber: Word);
    begin
    CXlsBof[4] := BuildNumber;
    XlsStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
    end;

    procedure XlsEndStream(XlsStream: TStream);
    begin
    XlsStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
    end;

    procedure XlsWriteCellRk(XlsStream: TStream; const ACol, ARow: Word; const AValue: Integer);
    var
    V: Integer;
    begin
    CXlsRk[2] := ARow;
    CXlsRk[3] := ACol;
    XlsStream.WriteBuffer(CXlsRk, SizeOf(CXlsRk));
    V := (AValue shl 2) or 2;
    XlsStream.WriteBuffer(V, 4);
    end;

    procedure XlsWriteCellNumber(XlsStream: TStream; const ACol, ARow: Word; const AValue: Double);
    begin
    CXlsNumber[2] := ARow;
    CXlsNumber[3] := ACol;
    XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
    XlsStream.WriteBuffer(AValue, 8);
    end;

    procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; const AValue: string);
    var
    L: Word;
    begin
    L := Length(AValue);
    CXlsLabel[1] := 8 + L;
    CXlsLabel[2] := ARow;
    CXlsLabel[3] := ACol;
    CXlsLabel[5] := L;
    XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
    XlsStream.WriteBuffer(Pointer(AValue)^, L);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var FStream: TFileStream;
       I, J: Integer;
    begin
    FStream := TFileStream.Create('c:e.xls', fmCreate);
    try
       XlsBeginStream(FStream, 0);
       for I := 0 to 99 do
         for J := 0 to 99 do
         begin
           XlsWriteCellNumber(FStream, I, J, 34.34);
          // XlsWriteCellRk(FStream, I, J, 3434);
          // XlsWriteCellLabel(FStream, I, J, Format('Cell: %d,%d', [I, J]));
         end;
       XlsEndStream(FStream);
    finally
       FStream.Free;
    end;
    end;



  • Profile
    유창원 2002.04.09 00:16
    • 이성남
    • 2002.04.09 02:43
    • 0 COMMENTS
    • /
    • 0 LIKES
    • KYH
      2002.04.09 02:47
         Memo1.SelStart := 0;    Memo1.SelLength:= 0;    Memo1.SetFocu...
    • 최용일
      2002.04.09 05:21
      안녕하세요. 최용일입니다. Scope문제 같군요... 형선언부를 위로 올리시면 될거같네요... type &nb...
    • 김진아
      2002.04.09 06:07
      조언 감사합니다. 소스를 수정해서 그 부분에서의 에러를 없애긴 했는데 다른 에러가 납니다. ----------...
    • 최용일
      2002.04.09 06:56
      델파이에서는... var     A: array[0..10] of Integer;     ...
    • 김진아
      2002.04.09 20:14
      답변 감사합니다. 오늘 아침에 답변보고 제가 하려던 부분을 만들었습니다. 좋은 하루보내세요.. ^^
    • 조현정
    • 2002.04.09 02:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최석기
      2002.04.09 02:39
      procedure TForm1.Button1Click(Sender: TObject); begin   // SendMessage(Memo1.Handle, EM_...
    • 최석기
      2002.04.09 02:30
      지금 도움말을 찾아보니까 Cast라는 함수가 있네여.. CAST(column_reference AS data_type) ex) S...
    • 박성경
    • 2002.04.09 02:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신석기
      2002.04.25 06:14
      다른분이 질문하셔서 답을 달아드렸는데 또 있군요 ^^; 한글 ime 모드 문제입니다. 개발환경에서 사용...
    • 공선옥
    • 2002.04.09 01:28
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 김경록
      2002.04.11 20:22
      직접 DBGrid에 입력을 하신다면, 답을 못 찾으실 겁니다.. 당연히, Dataset.FieldByName('수량').AsIntege...
    • 최은석
      2002.04.09 03:02
      DBGrid1.Fields[4].value := strtoint(edit1.text); DBGrid1.Fields[5].value := DBGrid1.Fields[3].valu...
    • 최은석
      2002.04.09 02:18
      DBGrid1.Fields[4].value := strtoint(edit1.text); DBGrid1.Fields[5].value := DBGrid1.Fields[3].value...
    • 공선옥
      2002.04.09 21:02
      아래와 같이 하니깐 에러 뜨는데.......어떻게 해야 하죠? 그리고 아래와 같이 하면 값을 저장하는 역할...
    • 김경록
      2002.04.11 20:27
      UpdateSQL을 사용하시지 않나여? 물론, 쿼리에서는 조인을 해서 가져오면 될테구.. UpdateSQL에서는 근태...
    • 정정호
      2002.04.09 02:26
      ...
    • 염상철
      2002.04.09 00:11
      전다른방법으로... 더블클릭에 하시던지..클릭에하시던지..이벤트에... var i:integer; for i:= 0 to...
    • 프로초보
      2002.04.09 01:19
      넵..글케하니깐 되씀다~~^0^ 답변 감사드리구욤.. 시간되심 밑에거 한번만 더 봐주시길 부탁드림다.. ...
    • 염상철
      2002.04.09 02:03
      선택안된부분더..for로 비교 하니까..항상 메세지가 뜨고빠져나오는겁니다.. 첫번째..리스트박스항목을 선...
    • 최석기
      2002.04.09 01:28
      procedure Tform1.btn1Click(Sender: TObject); begin   if listbox1.Itemindex = -1 then b...
    • 프로초보
      2002.04.09 02:51
    • 유창원
    • 2002.04.08 23:28
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최석기
      2002.04.08 23:35
      예전에 제가 테스트 해보니까 Excel을 Com 객체로 생성해서 사용하는 경우랑 비교할때 Com 객체 없이 엑셀 ...
    • 유창원
      2002.04.09 00:16
    • 유창원
    • 2002.04.08 23:23
    • 5 COMMENTS
    • /
    • 0 LIKES
    • KYH
      2002.04.08 23:34
      var     Text : TextFile;      dum:String; begin  &n...
    • 유창원
      2002.04.08 23:51
      파일에 기존에 있던 내용을 없애고 처음부터 다시 쓰려면 어떻게 해야 하나요?
    • KYH
      2002.04.09 00:04
          Rewrite(Text); --->> 걍 다시씁니다 ^^;;;
    • 유창원
      2002.04.09 00:17
    • 최석기
      2002.04.08 23:31
      이렇게 함 해보시져.. 레코드 단위로 FileStrem에 Write 해보시져.. try     ...
    • 방용균
    • 2002.04.08 23:11
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박성훈
    • 2002.04.08 22:34
    • 1 COMMENTS
    • /
    • 0 LIKES
    • Tk
      2002.04.09 00:00
      http://www.borlandforum.com 에 있떤 내용임다.
    • 신용관
    • 2002.04.08 22:26
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 정진훈
    • 2002.04.08 22:09
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 손규만
    • 2002.04.08 22:05
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 염상철
    • 2002.04.08 21:34
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 이성훈
      2002.04.08 22:03
      TQuery나 TTable  TField Object에서 해당Column의 EditMask를 변경하면 될것 같은데요. 그럼 ...
    • 염상철
      2002.04.08 22:57
      editMask값을 뭐라고 줘야 되져? ####-##-##하면... 2002- - 일케 나오는데... 알려주세여...
    • 염상철
      2002.04.08 23:39
      !99/99/00;0;_ 이렇게 넣으니까..되네여..
    • 염상철
      2002.04.09 02:38
      쿼리문에서.. select   substr(deliv_date,1,4)||'-'||substr(deliv_date,5,2)||'-'||substr(...
    • 박성훈
      2002.04.08 22:00
      안녕하세요? 날짜의 포맷은 제어판의 국가별설정의 영향을 받습니다. 그 부분과 관련된 사항인 것 같으...
    • 이동진
    • 2002.04.08 20:53
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 염상철
      2002.04.08 20:51
      저는..이런방법을 쓰곤 하는데염.. 쿼리를 오픈을 하지여.. With query1 do begin    &n...
    • 프로초보
      2002.04.08 23:39