Q&A

  • Excel을 종료 하는 방법좀 알려주세요
여기 저기 돌아다녀서 얻은 소스도 문제가 해결되지 않아 이렇게 올립니다.
문제는 Excel -> DB로 올리고 난후 Excel 파일을 열면 열리지 않는 오류입니다.

강제로 프로세스를 종료해도 계속 남아 있어서 다른 Excel 파일을 열수가 없습니다. 찾다 찾다 못해 이렇게 글을 올립니다.

해결 방법좀 알려주세요
그럼 좋은 하루되세요 ^^

//엑셀이 설치되었있을 경우만 가능
    try
      //엑셀을 실행
      XLApp := CreateOLEObject('Excel.Application');
    except
     MessageDlg(' Excel이 설치되어 있지 않습니다.',MtWarning,[mbok],0);
     exit;
    end;

    try
          XLApp.Visible := False;
          XLApp.DisplayAlerts := False;

          if odMaster.Execute then begin   --> 파일열기 다이얼로그실행

             XLOpenFile := odMaster.FileName;
             if Trim(XLOpenFile) = '' then Exit;

             XLBook := XLApp.WorkBooks.Open(XLOpenFile);
             XLBook := XLApp.WorkBooks.item[1]; //워크 쉬트 설정
            
             IFileName := ExtractFileName(XLOpenFile);
             //파일에서 확장자만 뺀 파일명을 가져온다. Table명으로 사용하기위해
             ISheetNM := Copy(IFileName,1,Pos('.',IFileName)-1);

             odMaster.Free;
          end;


          //---------------------------
          // ADO Open
          //---------------------------
          ADOQuery_Open_Flag := true;
          //---------------------------

          with ADOQuery do
          begin
            Close;
            ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
                                XLOpenFile + ';Extended Properties=excel 8.0;Persist Security Info=False';

            SQL.Clear;
            SQL.Text := 'SELECT * FROM ['+ISheetNM+'$]';
            Open;
          end;

          Query.Close;
          Query.DatabaseName := 'XXX';
          Query.SQL.Clear;

          ADOQuery.First;


          ProgressBar1.Position := 0;
          ProgressBar1.Step := 1;
          ProgressBar1.Min := 0;
          ProgressBar1.Max := ADOQuery.RecordCount;



          while not ADOQuery.EOF do begin

              df1   := '';
              df2   := '';
              df3   := '';

              df1  := ADOQuery.Fields[1].asString;                
              df2  := '12345678901234';                
              df3  := ADOQuery.Fields[2].asString;

              Query.SQL.Text := 'Insert into MAST values(''' + df1 + ''',''' +
                                   df2 + ''','''+  df3 +''')';

              Query.ExecSQL;

              ADOQuery.Next;
              ProgressBar1.Position := ADOQuery.RecNo;
          end;

          ADOQuery.Close;
          ADOQuery.Free;
          Query.Close;
          Query.Free;



          XLApp.WorkBooks.Close;

          //XLApp.Quit;
          //XLApp := unassigned;

   //강제종료하는 부분
   if not VarIsEmpty(XLApp) then
   begin
     XLApp.DisplayAlerts := False;
     XLApp.Quit;
     XLApp := unassigned;
   end;

          Screen.Cursor:= crDefault;

          ShowMessage('정상적으로 변환 성공 !');

      //Finalize(XLApp);
    except
      on err:exception do begin
        odMaster.Free;
        XLApp.WorkBooks.Close;
        //XLApp.Quit;
        //XLApp := unassigned;
       if not VarIsEmpty(XLApp) then
       begin
         XLApp.DisplayAlerts := False;
         XLApp.Quit;
         XLApp := unassigned;
       end;
        ShowMessage('작업이 취소되었습니다. Data확인요망-'+err.message);
        //Finalize(XLApp);
      end;
    end;
1  COMMENTS
  • Profile
    릴라 2003.11.27 02:47
    저도 예전에 겪은 문제인데요...
    엑셀을 뜨면 화면 한 구석에서 '예쁜짓' 하고 있는 강아지 있쟎습니까...
    이놈의 '이쁜짓' 때문에 바로 죽지 않습니다.

    이것을 안나오도록 설정하면 마로 죽을 겁니다.