无法打开另一个Excel文件(当通过.net打开一个Excel时)

我devise了一个.net应用程序,它将在login时打开一个excel文件,并用它来打印报告。 注销用户时将被closures。 我为excel文件设置可见为false,以便用户不知道后台进程。

但是,如果有人在这段时间内打开任何其他的Excel文件,我的报告Excel文件变得可见,并且Excel对象被折叠。 我必须去任务pipe理器并杀死所有打开的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 

请帮我解决这个问题。

使用Excel应用程序对象的IgnoreRemoteRequests属性:

xlApp.IgnoreRemoteRequests = True

这相当于检查Excel用户界面选项
文件| 选项| 高级| 一般| 忽略使用dynamic数据交换(DDE)的其他应用程序。
(请参阅超级用户上的相关答案 。)

我无法方便地使用.NET应用程序重现您的场景,但通过从Word VBA中绑定Excel.Application对象并按预期工作,运行了一些testing。 我创build了一个隐藏的Excel应用程序,并且能够通过在文件资源pipe理器中双击打开文件之前和之后对其执行操作。

在我的testing中,下次我正常打开Excel的时候,这个设置还没有被切换,但是如果这个行为不是通用的,你可能需要在退出应用程序对象之前捕获它的值并恢复它。

编辑:这种行为至less在Excel 2003以来,我使用Excel 2016(32位)进行了validation。

在Excel 2013或更高版本中,Excel切换到单个文档界面:每个工作簿在其自己的窗口中打开。

至less到2016年,Visual Basic编辑器仍然是一个多文档界面,您可以通过查看VBE中的Project Explorer窗格轻松查看哪些文件在应用程序会话中打开。

看起来你的问题是由同一个xlApp实例造成的。 我会做的很简单:我将初始化xlApp的新实例,然后相当那个应用程序的实例。 这样它就不会干扰任何其他打开的Excel实例。 下面是我在C#中使用它的方法:

 using Excel = Microsoft.Office.Interop.Excel; Excel.Application xlApp = new Excel.Application(); // by default this is invisible 

做任何你必须做的与xlApp的新实例,然后相当的应用程序。 一旦你的应用程序相当不会在你的任务pipe理器。

 xlApp.Application.Quit(); 

我devise了几个应用程序,我必须处理相同的Excel文件,而这些文件很可能是由相同的用户打开的。 这种方法(以不可见模式打开Excel的新实例,然后退出应用程序)从来没有给我造成任何问题。