Q&A

  • Excel로 변환시...
db내용을 Excel로 전환하는데 관련한 몇가지 문의가 있습니다...^^
무지 공부하고 있는데 머리가 터지기 일보직전입니다요...^^

1.excel컴포넌트를 이용해 excel접목하고 데이터를 넘기고 있습니다..
그런데 delphi프로그램을 띄우고 프로그램내에서 명령에 의해 엑셀이 자동으로 띄워지고 내용이 주욱 표시될때 작업하고 excel자체의 종료기능을 이용해 종료하는 과정을 5-6번 반복하여 거치면 그다음부터 memory상에 문제가 발생하는지 excel화면이 정상적으로 표시가 되지 않습니다..
그래서 아래의 명령문을 엑셀로 데이터를 모두 보낸이후 기술하니깐
Quit가 있으면 자동으로 나가버리고 주석처리하면 나가지는 않는데 excel종료하면 에러가 표시되요...
           ExcelApplication1.Disconnect;
           ExcelApplication1.Quit;
어떻게 하면 이문제를 해결할수 있는지요...

2.위 문제로 인하여 차라리 화면에 엑셀을 뛰우지 말고 데이터만 엑셀로 넘겨 엑셀화일을 만들어 저장하고 화면에 이러이러한 화일명으로 저장하였습니다라고 표시해 준후 사용자가 알아서 엑셀을 이용해 작업하도록 하였는데 이 경우
visible := false로 하고 위 작업은 그대로 진행했습니다...
그랬더니 실행을 하면 잠시후 dbgrid우측의 scroll bar가 아래로 주욱내려가면서 화면에 저장했다고 표시를 하더군요...
이경우 화면에 표시된 데이터량이 엄청 많으면 그만큼 속도가 처질것인데 화면에 엑셀을 안띄우고 그냥 엑셀화일로만 생성시킬때 방법은 따로 없을까요??

3.2번의 경우에서 saveas()를 이용해 화일을 저장하고 있습니다...
그런데 mfilename이라는 변수를 사용해서 특정 폴더내에 엑셀화일들을 저장하고 싶은데 saveas(mfilename)하면 에러가 나네요... mfilename 대신
'c:aaa.xls'하면 에러가 안나오고요... 어떻게 하면 되져??

4.제가 엑셀로 데이터를 넘길때 주로 사용하는 명령이
Range[Cells.Item[2,1], Cells.Item[3,1]]....
입니다.. 그런데 이경우 범위를 설정할때 아래와 같이 하면 에러가 나네요..
Range[Cells.Item[2,1]: Cells.Item[3,1]] ...
실질적으로는 range['a1:b5']... 식이지만 프로그램에 그 범위가 유동적으로
계속해서 변하는데 어떻게 알고 강제지정을 할수 있나요... 그래서 cells.item[]내에 연산식을 이용하면 그 범위를 지정할수 있는데 에러가 나타나서요...
무슨 방법이 있을까요... 이것이 일단되어야 테두리를 그리거나 병합을 하거나 할텐데요...

고수님들 초보적인 질문에 어이가 없으실줄로 알지만 그래도 너그러이 이해하셔서 답변을 부탁드립니다...^^
2  COMMENTS
  • Profile
    hoony 2003.05.22 21:07
    내용이 많아 곤란하면 저장과 동시에 엑셀화일을 오픈하는
    savedialog를 사용하고 쿼리를 바로 엑셀로 연결하여 사용하세요
    방법은

    쿼리를 오픈한다.
    query1.open;
    query1.first;
    if query1.eof then exit;
    쿼리를 순차적으로 읽으면서 구분자를 ','로 구분한다.
    assignfile(f,'csv화일.csv');
    rewrite(f);  //f는 textfile임 //
    sepr := ',';
    필요한만큼 루프를 돌린다.
    while not sender.eof do
    begin
      for ii := 0 query1.filecount -1 do
      begin
        write(f, query1.fields[ii].asstring + sepr);
      end;
      writeln(f, query1.fields[query1.fieldcount - 1].asstring);
      query1.next;
    end;
    writeln(f);
    closefile(f);
    query1.close;

    엑셀화일을 부른다.
    shellexecute(0,nil,pchar('csv화일.csv'),nil,nil,sw_shownormal);


  • Profile
    hoony 2003.05.22 22:47
    이방법도 많은 건수를 처리하려면 시간은 좀 걸리네여.^^
    보완해야될 내용은 다음과 같습니다.

                         while not query1.eof do
                         for ii := 0 to query1.fieldcount -1 do
                        shellexecute(0,nil,pchar('csv화일.csv'),nil,nil,sw_shownormal);//uses절에 shellapi추가//