Как удалить процесс EXCEL, используемый VB.NET

Прежде чем этот вопрос будет закрыт из-за его дубликата, я попробовал эти ответы.

Процесс Excel не закрывается в VB.net

Приложение не завершает работу после вызова quit

Программа VB.NET Excel оставляет EXCEL.EXE плавающим после завершения

Процесс Excel по-прежнему выполняется после закрытия в VB.net

Но ни один из них не работал у меня, я также пытался искать в Интернете.

Открытие файла Excel оставляет открытым процесс "EXCEL.EXE" (и множество других), но процесс остается.

Это программное обеспечение будет автоматическим загрузчиком, который будет запускаться при загрузке компьютера. затем он проверит раздел диска D компьютера и загрузит в него все файлы excel. Я уже использовал это для загрузки файлов CSV и никогда не имел таких проблем, однако теперь я пытаюсь загрузить файлы Excel.

Я хочу знать, как правильно убить процесс без использования команды «KILL». Я также пытался использовать process.kill, но когда я открываю другую книгу Excel с компьютера, этот Excel уничтожается, а не загружается Excel.

Обратите внимание, что этот код каким-то образом изменен, чтобы просто выводить содержимое Excel, он уже работает, я просто хочу знать, как закрыть ПРОЦЕСС EXCEL, поскольку может быть время, когда эта система будет загружать сотни рабочих листов Excel.

Я использовал этот код ниже:

 Sub uploadExcelFiles(ByVal locs As String)

            Dim xlApp As Excel.Application
            Dim xlWorkBook As Excel.Workbook
            Dim xlWorkSheet As Excel.Worksheet

            Dim location As String
            Dim isData As Boolean = False
            Dim m_CountTo As Integer = 0

            filename = ""
            globalloc = ""
            'Gets Files from Folders
            Dim counting As Integer = 0
            Dim csvcount As String() = Directory.GetFiles(locs, "*.xls")
            Dim ToUploadCSV As String

            ExcelProcessInit()


            For counting = 0 To csvcount.Count - 1
                CheckListofCSV.Clear()
                filename = ""

                location = csvcount(counting).ToString
                globalloc = location

                ToUploadCSV = Path.GetFileName(location).ToString
                Dim ListLines As New List(Of String)
                Dim ListLinesNEW As New List(Of String)

                xlApp = New Excel.Application
                xlWorkBook = xlApp.Workbooks.Open(location)
                xlWorkSheet = xlWorkBook.Worksheets("Sheet1")
                'Use this code to read the data from EXCEL

                '**DATA HEADER**
                MsgBox(xlWorkSheet.Cells(2, 6).value)
                MsgBox(xlWorkSheet.Cells(2, 7).value)
                MsgBox(xlWorkSheet.Cells(2, 8).value)
                MsgBox(xlWorkSheet.Cells(3, 2).value)
                MsgBox(xlWorkSheet.Cells(3, 5).value)
                MsgBox(xlWorkSheet.Cells(3, 8).value)
                MsgBox(xlWorkSheet.Cells(4, 2).value)
                MsgBox(xlWorkSheet.Cells(4, 5).value)
                MsgBox(xlWorkSheet.Cells(4, 7).value)
                MsgBox(xlWorkSheet.Cells(4, 8).value)
                MsgBox(xlWorkSheet.Cells(62, 2).value)
                '**DATA HEADER**

                '**DATA DETAILS**
                'ROWS
                Dim i As Integer = 5
                'COLUMNS
                Dim col As Integer = 2
                'SAMPLING COUNT FROM EXCEL
                Dim SampQTYXcel As Integer = 0

                Do While Len(xlWorkSheet.Cells(i, col).value) > 0


                    For i = 5 To 10
                        MsgBox(xlWorkSheet.Cells(i, col).value)
                    Next
                    'This is sampling QTY
                    getSamplingQty(xlWorkSheet.Cells(3, 2).value, xlWorkSheet.Cells(5, col).value, xlWorkSheet.Cells(3, 8).value)

                    'Sample Data 10 onwards
                    Do While Len(xlWorkSheet.Cells(i, col).value) > 0
                        MsgBox(xlWorkSheet.Cells(i, col).value)
                        i = i + 1
                        SampQTYXcel = SampQTYXcel + 1
                    Loop

                    'Excel data has more data than Database QTY then REPORT 
                    If SampQTYXcel > SamplQTY Then
                        'SEND ERROR
                        MsgBox("ERROR")
                    End If

                    'Add 1 to move to next column
                    col = col + 1
                    i = 5
                    SampQTYXcel = 0
                Loop

                xlWorkBook.Save()

                '**DATA DETAILS**

                xlApp.DisplayAlerts = False
                xlWorkBook.Close()
                xlApp.Quit()

                xlApp = Nothing
                xlWorkBook = Nothing
                releaseObject(xlWorkBook)
                releaseObject(xlWorkSheet)
                releaseObject(xlApp)

                GC.Collect()
                GC.WaitForPendingFinalizers()

                ExcelProcessKill()

            Next

        End Sub

РЕДАКТИРОВАТЬ:

Я забыл добавить коды ExcelProcessInit() и ExcelProcessKill()

Вот их коды:

Private Sub ExcelProcessInit()
    Try
        'Get all currently running process Ids for Excel applications
        mExcelProcesses = Process.GetProcessesByName("EXCEL")
    Catch ex As Exception
    End Try
End Sub

 Private Sub ExcelProcessKill()
        Dim oProcesses() As Process
        Dim bFound As Boolean

        Try
            'Get all currently running process Ids for Excel applications
            oProcesses = Process.GetProcessesByName("EXCEL")

            If oProcesses.Length > 0 Then
                For i As Integer = 0 To oProcesses.Length - 1
                    bFound = False

                    For j As Integer = 0 To mExcelProcesses.Length - 1
                        If oProcesses(i).Id = mExcelProcesses(j).Id Then
                            bFound = True
                            Exit For
                        End If
                    Next

                    If Not bFound Then
                        oProcesses(i).Kill()
                    End If
                Next
            End If
        Catch ex As Exception
        End Try
    End Sub

person Mr.J    schedule 05.07.2018    source источник
comment
Когда вы говорите, что ничего из этого не сработало для меня... что, вкратце, произошло в каждом случае?   -  person QHarr    schedule 05.07.2018
comment
@QHarr, попробовав все, что я прочитал в SO, я запускаю приложение, затем проверяю через диспетчер задач Windows, был ли удален процесс EXCEL, но это не так. Затем, используя PROCESS.KILL, он удалил процесс EXCEL, но пользователю не нужен инструмент, который внезапно закрывает его работу. Спасибо за уделенное время.   -  person Mr.J    schedule 05.07.2018
comment
Я считаю, что это сводится к порядку, в котором вы их выпускаете. Взгляните на мой ответ здесь, который ссылается на другой хорошо собранный отвечать. Это может помочь. Не забудьте закрыть вещи в обратном порядке. Итак, закройте лист, затем рабочую книгу, затем приложение.   -  person Bugs    schedule 05.07.2018
comment
Также отмечено в вашем профиле, что вы говорите о написании хороших вопросов. Этот вопрос, ИМО, хорош, но для справки прочитайте это в деталях :)   -  person Bugs    schedule 05.07.2018
comment
К сожалению, вы наткнулись на темную сторону SO, где поклоняются культовым программным решениям, вместо того, чтобы идти в свете знаний. Ганс написал очень хороший ответ о том, почему COM-объекты не выпущены и как решить проблему. Вариант представленного им метода, который использует [Marshal.AreComObjectsAvailableForCleanup], представлен здесь.   -  person TnTinMn    schedule 05.07.2018
comment
@Bugs, ваш ответ помог мне, я пометил этот вопрос как дубликат этого вопроса, потому что это ответ, который я ищу.   -  person Mr.J    schedule 06.07.2018
comment
Не проблема, @Mr.J рад, что это помогло.   -  person Bugs    schedule 06.07.2018