2016-12-09 11 views
0

질문 : 응용 프로그램이 실행되는 동안 Excel 프로세스를 닫지 않는 이유는 무엇입니까? 총을 뛰어 넘지 말고 중복으로 표시하십시오. 코드에 필요한 변경 사항을 보여줄 수 있다면 정말 고맙습니다. 응용 프로그램을 닫으면 Excel 프로세스가 제대로 닫힙니다. 지난 며칠 동안이 문제를 연구하여 몇 가지 게시물을 읽고 여러 가지 시도를했지만 가능한 경우 피하기를 선호하는 process.kill을 호출하는 것 외에는 아무 것도 작동하지 않습니다.응용 프로그램이 실행되는 동안 Excel 프로세스가 닫히지 않는 이유

Imports Microsoft.Office.Interop 
Imports System.Runtime.InteropServices 

Public Class Form1 

    Public Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim xlApp As Excel.Application 
     Dim xlWorkBook As Excel.Workbook 
     Dim misValue As Object 
     Dim xlWorkSheet As Excel.Worksheet 

     Try 
      ''EXCEL CREATION/INITAILIAZATION 
      misValue = System.Reflection.Missing.Value 
      xlApp = New Microsoft.Office.Interop.Excel.Application() 
      If xlApp Is Nothing Then 
       MessageBox.Show("Excel is not properly installed!!") 
       xlApp = Nothing 
      End If 
      xlWorkBook = xlApp.Workbooks.Add(misValue) 


      ''WRITE TO WORKSHEET 
      xlWorkSheet = TryCast(xlWorkBook.Sheets("sheet1"), Excel.Worksheet) 
      xlWorkSheet.Cells(1, 1) = "THIS" 
      xlWorkSheet.Cells(1, 2) = "IS" 
      xlWorkSheet.Cells(1, 3) = "A" 
      xlWorkSheet.Cells(1, 4) = "TEST" 

      ''FORCEFULLY CAUSING ERROR, NOW THE EXCEL PROCESS HANGING IN TASK MANAGER 
      ''xlWorkSheet.Cells(1, -1) = "ERROR LINE" 

      ''SAVE WORKSHEET 
      Dim Name = DateTime.Now.ToString("s").Replace(":", "_") 
      Dim Dir = AppDomain.CurrentDomain.BaseDirectory & "Output\" & Name & "Output.xls" 
      xlApp.DisplayAlerts = False 
      xlWorkBook.CheckCompatibility = False 
      xlWorkBook.DoNotPromptForConvert = True 
      xlWorkBook.SaveAs(Dir, Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing, _ 
           Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing) 
      xlWorkBook.Close(False) 
      xlApp.Quit() 

      misValue = Nothing 

      If Not IsNothing(xlWorkSheet) And System.Runtime.InteropServices.Marshal.IsComObject(xlWorkSheet) Then 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet) 
       xlWorkSheet = Nothing 
      End If 

      If Not IsNothing(xlWorkBook) And System.Runtime.InteropServices.Marshal.IsComObject(xlWorkBook) Then 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook) 
       xlWorkBook = Nothing 
      End If 

      If Not IsNothing(xlApp) And System.Runtime.InteropServices.Marshal.IsComObject(xlApp) Then 
       System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp) 
       xlApp = Nothing 
      End If 

      GC.Collect() 
      GC.WaitForPendingFinalizers() 

     Catch ex As Exception 
      Dim exMsg = ex.Message 
     End Try 
    End Sub 

End Class 
+0

이것은 답변이 아니지만 가능한 경우 Excel 파일을 저장하기위한 좋은 API를 찾을 것을 제안합니다. interop을 사용하면 이와 같은 문제가 발생할 수 있으며 매우 느립니다. –

+0

당신의 문제는 무엇입니까? 당신은 분명히 대담 해집니다 * 귀하의 질문에 대응하는 응용 프로그램을 닫을 때 Excel 프로세스가 잘 종료됩니다. 또한 VB.Net에 익숙하지 않지만 '잡아 먹기'에 리소스 ('xlApp = Nothing')를 배포하거나 더 나은 ['Finally'] (https://msdn.microsoft.com/en)에 있어야합니다. -us/library/fk6t46tz.aspx) 절 – Parfait

+0

@Parfait 문제는 ​​처음으로 굵게 표시됩니다. 하위가 선언 된 객체는 하위의 끝에서 범위를 벗어나야합니다. 위의 코드를 실행하고 버튼을 몇 번 클릭하면 모든 예외 처리 인스턴스가 서브 프로세스의 끝에서 닫히는 것을 보게 될 것입니다. – glant

답변

0

문제는 .net에서 두 점 참조입니다. 여기에 읽기 : https://msdn.microsoft.com/en-us/library/8bwh56xe(v=vs.110).aspx

당신이

xlWorkBook = xlApp.Workbooks.Add(misValue) 

xlWorkBooks = xlApp.Workbooks 
xlWorkBook = xlWorkBooks.Add(misValue) 

하고 그것을 풀어 해체 그렇게하면, 당신은 모든 좋다.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Call doSomeWork() 
    GC.Collect() 
End Sub 

Private Sub doSomeWork() 
    Dim xlApp As Excel.Application 
    Dim xlWorkBook As Excel.Workbook 
    Dim xlWorkBooks As Excel.Workbooks '// Added new variable to avoid double dot. 
    Dim misValue As Object 
    Dim xlWorkSheet As Excel.Worksheet 

    Try 
     ''EXCEL CREATION/INITAILIAZATION 
     misValue = System.Reflection.Missing.Value 
     xlApp = New Microsoft.Office.Interop.Excel.Application() 
     If xlApp Is Nothing Then 
      MessageBox.Show("Excel is not properly installed!!") 
      xlApp = Nothing 
     End If 
     xlWorkBooks = xlApp.Workbooks 
     xlWorkBook = xlWorkBooks.Add(misValue) 


     ''WRITE TO WORKSHEET 
     xlWorkSheet = xlWorkBook.Sheets(1) 

     'xlWorkSheet = TryCast(sheets("sheet1"), Excel.Worksheet) 
     xlWorkSheet.Cells(1, 1) = "THIS" 
     xlWorkSheet.Cells(1, 2) = "IS" 
     xlWorkSheet.Cells(1, 3) = "A" 
     xlWorkSheet.Cells(1, 4) = "TEST" 

     ''FORCEFULLY CAUSING ERROR, NOW THE EXCEL PROCESS HANGING IN TASK MANAGER 
     ''xlWorkSheet.Cells(1, -1) = "ERROR LINE" 

     ''SAVE WORKSHEET 
     Dim Name = DateTime.Now.ToString("s").Replace(":", "_") 
     Dim Dir = AppDomain.CurrentDomain.BaseDirectory & "Output\" & Name & "Output.xls" 
     xlApp.DisplayAlerts = False 
     xlWorkBook.CheckCompatibility = False 
     xlWorkBook.DoNotPromptForConvert = True 
     xlWorkBook.SaveAs("C:\temp\a.xls", Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing, _ 
          Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing) 
     xlWorkBook.Close(False) 
     xlApp.Quit() 

     misValue = Nothing 

    Catch ex As Exception 
    End Try 
End Sub 
+0

을 통해 제공되는 [EPPlus] (https://www.nuget.org/packages/EPPlus)입니다. 답변 해 주셔서 감사합니다. 나는 xlWorkbooks를 별도의 변수로 사용하여 연결 점을 피하려고 노력했지만 작동하지 않았다. 그래서 나는 당신의 대답이 작동하는 것을 보았을 때, 이전에 나를 위해 작동하지 않는 이유를 알아야만했다. 그리고 내 델타 솔루션과 당신. TRY/CATCH 블록이 그 원인이었습니다. 위의 try/catch 블록과 원래 코드를 주석 처리했습니다. 당신의 포스트가 저에게 준 동기 부여에 감사드립니다. – glant

+0

이 솔루션에 try/catch 블록을 추가하면 실패 할 것입니다. 내게는 그랬고 동료 상자에서도 테스트했습니다 ... 이유는 없습니다. – glant

+0

hmm .... 별개의 하위를 호출하는 이벤트 처리기에서 발생합니다. 모든 작업을 수행하는 try catch catch를 사용할 수 있습니다. sub를 호출 한 다음 정리하십시오. 업데이트 된 코드는 나를 위해 작동합니다. – cyboashu