Я разрабатываю надстройку 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