Excel Interop в Vb.Net - проблема закрытия книги - PullRequest
0 голосов
/ 08 ноября 2019

Я разрабатываю надстройку VB.Net Excel, используя сборку Excel.Interop, чтобы сохранить каждый лист рабочей книги в файл csv. Приведенный ниже код отлично работал в течение многих лет в Excel 2010. Мы недавно переехали в Excel 2016, и возникла проблема, когда второй экземпляр Excel открывается и остается открытым после закрытия последней временной книги «ptrBook». Мне нужно, чтобы это было закрыто автоматически, но принудительное закрытие Excel.Exit закрывает этот дополнительный экземпляр и исходный экземпляр, содержащий мою оригинальную книгу.

Спасибо за любую помощь.

Imports System.ComponentModel
Imports System.Runtime.InteropServices
Imports Excel = Microsoft.Office.Interop.Excel

Public Class frmSaveCSV

    Private pages As BindingList(Of Page)
    Private excelApp As Excel.Application


    Sub New(ByVal hostApp As Excel.Application, ByVal pagesList As BindingList(Of Page))
        InitializeComponent()

        excelApp = hostApp
        pages = pagesList
    End Sub

    Private Sub frmSaveCSV_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
        InitProgressBar()
        excelApp.Visible = False
        SaveCSV()
        excelApp.Visible = True
        Me.Close()
    End Sub

    Private Sub InitProgressBar()
        prgProgress.Minimum = 0
        prgProgress.Maximum = pages.Count()
        prgProgress.Value = 0
    End Sub

    Private Sub SaveCSV()

        'excelApp.Application.ScreenUpdating = False

        Dim excelApp_Workbooks As Excel.Workbooks = excelApp.Workbooks

        For i As Integer = 1 To pages.Count Step 1

            Application.DoEvents()

            Dim strWorkbook As String = pages(i - 1).BookName
            Dim strSheet As String = pages(i - 1).SheetName
            Dim strFilename As String = pages(i - 1).FileName

            lblBook.Text = strWorkbook
            lblSheet.Text = strSheet
            lblCSV.Text = strFilename

            Try
                Dim strFullPathFilename As String = excelApp_Workbooks(strWorkbook).Path & "\" & strFilename

                Dim Wb As Excel.Workbook = excelApp_Workbooks(strWorkbook)
                Dim Sh As Excel.Worksheet = CType(Wb.Worksheets(strSheet), Excel.Worksheet)

                Sh.Copy()

                Dim ptrBook As Excel.Workbook = excelApp_Workbooks.Item(excelApp_Workbooks.Count)

                'Turn off alerts so overwrite prompt does not display
                excelApp.DisplayAlerts = False

                Try
                    ptrBook.SaveAs(strFullPathFilename, Excel.XlFileFormat.xlCSV, , , , False)
                Catch ex As Exception
                    'MsgBox(ex.Message)
                End Try

                excelApp.DisplayAlerts = True

                ptrBook.Close(False,, False)

                Marshal.ReleaseComObject(Wb)
                Marshal.ReleaseComObject(Sh)
                Marshal.ReleaseComObject(ptrBook)

                ptrBook = Nothing
                prgProgress.Value = i

            Catch ex As Exception
                MessageBox.Show("Unable to save the file """ & strFilename & """. Try manually saving the .xls file to disk before attempting to make .csv files.     " & ex.Message)
            End Try

        Next

        Marshal.ReleaseComObject(excelApp_Workbooks)

        'excelApp.Application.ScreenUpdating = True

    End Sub

End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...