Q&A

  • StringGrid=>Excel 더빠르게 전환하는 방법
StringGrid에 만건정도의 데이타가 있는데

엑셀로 받으려고 하니 앞의 방법으로는 시간이 너무 오래걸립니다.

(앞의방법 : row * col을 for문을 돌면서 엑셀로 올림)



그래서 배열을 이용해 한 Row씩 저장하여 엑셀로 변환시키는 방법(아래처럼)을 썼더니

1분정도 걸리더군요.



좀더 빠른 방법이 있을 것 같은데 좀처럼 찾을 수 없어서 문의드립니다.

혹시 아시면 답변 주시면 감사하겠습니다.



==================================================================

(아래)

procedure TmainForm.print_adj_data;

Var

XL, XLBook, XArr : Variant;

title : string;

si, sj : integer;

vv_sTemp: string;

const

vv_scol : array [0..25] of PChar = ('A','B','C','D','E','F','G',

'H','I','J','K','L','M','N',

'O','P','Q','R','S','T','U',

'V','W','X','Y','Z');

FieldCount : Integer = 18;

begin

title := 'title 명';

XArr := VarArrayCreate([1, FieldCount] , VarVariant); //data 처리변수



with devStrgrid1 do begin

try

XL := CreateOLEObject('Excel.Application'); //엑셀을 실행

except

on E: EOleSysError do begin

try

XL := CreateOLEObject('Excel.Application'); //엑셀을 실행

except

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

Exit;

end;

end;

end;

try

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

XLBook.WorkSheets[1].Name := Title;

si := 0;

sj := 0;



for sj := 0 to RowCount - 1 do begin

for si := 0 to colCount - 1 do begin

vv_sTemp := vv_sCol[si]+IntToStr(sj+1);

XArr[si+1] := Cells[si,sj];

end;

XL.Range[ XL.Cells[(sj+1), 1],

XL.Cells[(sj+1), si]].Value := XArr;

end;



XL.Visible := True;

XLBook.WorkSheets[Title].Range['A1', 'A1'].Select;

XL.Selection.Columns.AutoFit;

finally

XLBook := UnAssigned;

XL := UnAssigned;

end;

end;

end;





3  COMMENTS
  • Profile
    SPITZMAN 2001.06.26 20:44
    지금 사용하시는 방법보다는

    스트링그리드의 COMMATEXT속성을 이용하여 임시파일에 먼저 저장한다음

    엑셀을 시작할때 이 파일을 같이 열어주면 될것 같네요.

  • Profile
    SPITZMAN 2001.06.26 20:44
    지금 사용하시는 방법보다는

    스트링그리드의 COMMATEXT속성을 이용하여 임시파일에 먼저 저장한다음

    엑셀을 시작할때 이 파일을 같이 열어주면 될것 같네요.

  • Profile
    명탁 2001.06.14 10:43
    chunli wrote:

    > StringGrid에 만건정도의 데이타가 있는데

    > 엑셀로 받으려고 하니 앞의 방법으로는 시간이 너무 오래걸립니다.

    > (앞의방법 : row * col을 for문을 돌면서 엑셀로 올림)

    >

    > 그래서 배열을 이용해 한 Row씩 저장하여 엑셀로 변환시키는 방법(아래처럼)을 썼더니

    > 1분정도 걸리더군요.

    >

    > 좀더 빠른 방법이 있을 것 같은데 좀처럼 찾을 수 없어서 문의드립니다.

    > 혹시 아시면 답변 주시면 감사하겠습니다.

    >

    > ==================================================================

    > (아래)

    > procedure TmainForm.print_adj_data;

    > Var

    > XL, XLBook, XArr : Variant;

    > title : string;

    > si, sj : integer;

    > vv_sTemp: string;

    > const

    > vv_scol : array [0..25] of PChar = ('A','B','C','D','E','F','G',

    > 'H','I','J','K','L','M','N',

    > 'O','P','Q','R','S','T','U',

    > 'V','W','X','Y','Z');

    > FieldCount : Integer = 18;

    > begin

    > title := 'title 명';

    > XArr := VarArrayCreate([1, FieldCount] , VarVariant); //data 처리변수

    >

    > with devStrgrid1 do begin

    > try

    > XL := CreateOLEObject('Excel.Application'); //엑셀을 실행

    > except

    > on E: EOleSysError do begin

    > try

    > XL := CreateOLEObject('Excel.Application'); //엑셀을 실행

    > except

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

    > Exit;

    > end;

    > end;

    > end;

    > try

    > XLBook := XL.WorkBooks.Add; //새로운 페이지 생성

    > XLBook.WorkSheets[1].Name := Title;

    > si := 0;

    > sj := 0;

    >

    > for sj := 0 to RowCount - 1 do begin

    > for si := 0 to colCount - 1 do begin

    > vv_sTemp := vv_sCol[si]+IntToStr(sj+1);

    > XArr[si+1] := Cells[si,sj];

    > end;

    > XL.Range[ XL.Cells[(sj+1), 1],

    > XL.Cells[(sj+1), si]].Value := XArr;

    > end;

    >

    > XL.Visible := True;

    > XLBook.WorkSheets[Title].Range['A1', 'A1'].Select;

    > XL.Selection.Columns.AutoFit;

    > finally

    > XLBook := UnAssigned;

    > XL := UnAssigned;

    > end;

    > end;

    > end;

    >

    >

    어느세월에 셀카운트해서 하나하나씩 하실려구여..

    BatchMove 컴포넌트 쓰세요..

    한번에 넘어가지요.