Подтвердить что ты не робот

Не удалось открыть другой файл excel (когда один excel открывается .net)

Я разработал приложение .net, которое откроет файл excel во время входа в систему и будет использовать его для печати отчета. Он будет закрыт при выходе пользователя из системы. Я установил видимое значение false для файла excel, так что пользователь не знает об фоновом процессе.

Но если кто-нибудь откроет какой-либо другой файл excel за это время, мой файл Excel Excel станет видимым, а объект excel будет свернут. Я должен пойти в диспетчер задач и убить все открытые экземпляры excel, чтобы исправить это.

Код:

 Private Sub OK_Click(sender As Object, e As EventArgs) Handles OK.Click
        Try
            Dim dt As New DataTable()
            Dim Adapter As New SqlDataAdapter()
            ConnectMe()
            Dim SQLCmd As New SqlCommand("uspLogin", Con)
            SQLCmd.CommandType = CommandType.StoredProcedure
            SQLCmd.Parameters.AddWithValue("@pLoginName", UsernameTextBox.Text.Trim())
            SQLCmd.Parameters.AddWithValue("@pPassword", PasswordTextBox.Text.Trim())
            Adapter.SelectCommand = SQLCmd
            Adapter.Fill(dt)
            SQLCmd.Dispose()
            If dt.Rows.Count > 0 Then
                Me.Cursor = Cursors.WaitCursor
                Loading.Show()
                OpenAllTempaltes()            
                Me.Hide()                
                Con.Close()
                Me.Cursor = Cursors.Arrow
            Else
                MsgBox("Your Credential is Wrong !!!", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Login")
                UsernameTextBox.Text = ""
                PasswordTextBox.Text = ""              
                UsernameTextBox.Focus()
            End If
        Catch ex As Exception         
            Application.Exit()
        End Try
    End Sub

 Public Sub OpenAllTempaltes()
        Try                                   
            xlWorkBook = xlApp.Workbooks.Open(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Templates", "Excel_Templates_GST.xlsm"), Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, True)                
        Catch ex As Exception
            Throw
        End Try
    End Sub

    Public Sub CloseAllTempaltes()
        Try
            CleanUp(xlApp, xlWorkBook, xlWorkSheet)
        Catch ex As Exception
            ExceptionLog("PrintPage", "CloseAllTempaltes", ex.ToString(), DateTime.Now.ToString("dd-MMM-yyyy"))
        Finally
            GC.Collect()
        End Try
    End Sub

Пожалуйста, помогите мне, как это предотвратить.

4b9b3361

Ответ 1

Используйте свойство IgnoreRemoteRequests объекта приложения Excel:

xlApp.IgnoreRemoteRequests = True

Это эквивалент проверки опции Excel UI на
Файл | Варианты | Расширенный | Общий | Игнорировать другие приложения, использующие Dynamic Data Exchange (DDE).
(См. Этот связанный ответ на SuperUser.)

Я не смог бы удобно воспроизвести ваш сценарий с помощью .NET-приложения, но запустил некоторые тесты, заключив привязку объекта Excel.Application из Word VBA, и он работал по назначению. Я создал скрытое приложение Excel и смог выполнить действия над ним до и после открытия файлов, дважды щелкнув в Проводнике.

В моих тестах этот параметр не был переключен в следующий раз, когда я нормально открывал Excel, но вы можете захотеть захватить его значение и восстановить его до выхода из вашего объекта приложения, если это поведение не является универсальным.

Изменить: это поведение было по крайней мере с Excel 2003, и я проверил использование Excel 2016 (32-разрядный).

В Excel 2013 или более поздней версии Excel переключился на один интерфейс документа: каждая рабочая книга открывается в своем собственном окне.

Как минимум до 2016 года редактор Visual Basic оставался интерфейсом нескольких документов, и вы можете легко увидеть, какие файлы открыты в сеансе приложения, посмотрев на панель Project Explorer в VBE.

Ответ 2

Похоже, ваша проблема вызвана тем же экземпляром xlApp. Я бы сделал просто: я бы инициализировал новый экземпляр xlApp, а затем вполне тот экземпляр приложения. Таким образом, это не будет мешать никакому другому открытому экземпляру Excel. Вот как я использую его в С#:

using Excel = Microsoft.Office.Interop.Excel;

Excel.Application xlApp = new Excel.Application();  // by default this is invisible

сделайте все, что вам нужно для нового экземпляра xlApp, а затем достаточно приложения. После того, как вы полностью используете приложение, оно не будет в вашем диспетчере задач.

xlApp.Application.Quit();

Я разработал несколько приложений, где мне пришлось обрабатывать те же файлы Excel, которые, скорее всего, были бы открыты теми же пользователями. Этот подход (открытие нового экземпляра excel в невидимом режиме, а затем выход из приложения) никогда не вызывал проблем для меня.