Q&A

  • 엑셀데이터로 저장한 다음...
폼에 ExcelApplication, ExcelWorkbook, ExcelWorksheet를 추가하고 버튼이벤트에 다음과 같이 기록했습니다...

procedure Tilbo1F.SpeedButton10Click(Sender: TObject);
const
   xlleft = -4131;
   xlright = -4152;
   xltop = -4160;
   xlbottom = -4107;
   xlline = 1;
   xlbline = 9;
   xlcenter = -4108;
var i, j, m_Ex_Row, m_Ex_Col: integer;
    m_ExTitle, m_ExFile : string;
begin
  if ZQuery1.RecordCount <= 0 then Exit;

  try
    ExcelApplication1.Connect;
  except
    MessageDlg('Excel과 연결되지 않습니다.', mtError, [mbOk], 0);
    Abort;
  end;

  m_ExFile  := '파일명_' + DateToStr(DateTimePicker1.Date);
  m_ExTitle := '타이틀';

  try
    ExcelApplication1.Caption := m_ExTitle;
    ExcelApplication1.Workbooks.Add(xlWBATWorksheet,0);
    ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Item[1]);
    ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets[1] as _Worksheet);

    m_Ex_Row := ZQuery1.RecordCount + 20;
    m_Ex_Col := DBGrid1.Columns.Count;
    with ExcelWorksheet1 do
         begin
           Range[Cells.Item[1,1], Cells.Item[m_Ex_Row,m_Ex_Col]].Font.Name := '굴림체';
           Range[Cells.Item[1,1], Cells.Item[m_Ex_Row,m_Ex_Col]].Font.Bold := False;
           Range[Cells.Item[1,1], Cells.Item[m_Ex_Row,m_Ex_Col]].Font.Size := 10;
           Range[Cells.Item[1,1], Cells.Item[m_Ex_Row,m_Ex_Col]].VerticalAlignment := xlcenter;

           Range[Cells.Item[1,1],Cells.Item[1,m_Ex_Col]].MergeCells := True;
           Cells.Item[1,1] := m_ExTitle;
           Cells.Item[1,1].HorizontalAlignment := xlcenter;

           Range[Cells.Item[2,1],Cells.Item[2,m_Ex_Col]].MergeCells := True;
           Cells.Item[2,1] := '조회일자 : ' + DateToStr(DateTimePicker1.Date);
           Cells.Item[2,1].HorizontalAlignment := xlleft;

           for i := 1 to m_Ex_Col do
               begin
                 Cells.Item[3,i] := DBGrid1.Columns[i-1].Title.Caption;
                 Range[Cells.Item[3,1], Cells.Item[3,m_Ex_Col]].HorizontalAlignment := xlcenter;

                 if DBGrid1.Columns[i-1].Alignment = taRightJustify then
                    Range[Cells.Item[4,i], Cells.Item[m_Ex_Row,i]].HorizontalAlignment := xlright;
                 if DBGrid1.Columns[i-1].Alignment = taLeftJustify  then
                    Range[Cells.Item[4,i], Cells.Item[m_Ex_Row,i]].HorizontalAlignment := xlleft;
                 if DBGrid1.Columns[i-1].Alignment = taCenter       then
                    Range[Cells.Item[4,i], Cells.Item[m_Ex_Row,i]].HorizontalAlignment := xlcenter;
               end;

           ZQuery1.First;
           i := 4;
           while not ZQuery1.Eof do
                 begin
                   for j := 1 to m_Ex_Col do
                       begin
                         Cells.Item[i,j] := DBGrid1.Fields[j-1].Value;
                       end;
                   i := i + 1;
                   ZQuery1.Next;
                 end;

           m_ExFile := jesmain.m_imsipath + m_ExFile + '.xls';
           if fileexists(m_ExFile) then deletefile(pchar(m_ExFile)) ;
           SaveAs(m_ExFile);
           ExcelApplication1.Disconnect;
           ExcelApplication1.Quit;
           MessageDlg(m_ExFile+'로 저장되었습니다.', mtConfirmation, [mbOk], 0) ;
         end;
  except
    on E: Exception do
       begin
         ShowMessage(E.Message);
         ExcelApplication1.Disconnect;
         ExcelApplication1.Quit;
       end;
  end;
  DBGrid1.SetFocus;
end;

이러고 나면 엑셀파일로 내용이 잘 만들어집니다... 그런데 문제는 현 프로그램이 띄워진 상태에서 탐색기를 이용해 만들어진
파일을 더블클릭하면 엑셀창만 표시되고 내용이 나타나질 않습니다... 먹통이 된다고 해야하나요...
그런데 프로그램 종료하고 더블클릭하거나 프로그램이 그대로 있는 상태에서 그냥 엑셀을 실행해서 해당화일을 불러오기해서
해당파일을 불러오면 잘 읽어들여서 화면에 보여줍니다...
아무래도 저 위 코딩상에 엑셀파일을 만들고 나서 메모리상에 문제가 발생하는 요지가 있는듯 싶은데 뭔지를 모르겠습니다...
알려주십시요...

1  COMMENTS
  • Profile
    Charls 2006.11.14 19:59
    디버그 모드에서 그런경우가 종종 발생한적이 있습니다.
    소스상에 원인을 찾기에는 내공이 부족하여 정확한 답변을 드리기는 어렵지만
    작업관리자의 프로세스를 보면 Excel.exe 가 실행중임을 알 수 있습니다.
    (화면에는 않나타나지만...)

    이것은 메모리 핸들링 상의 문제인듯합니다.
    즉, 컴파일후 실행파일로 테스트를 해보시면 언급하신 문제는 발생하지 않는 다는 점입니다.