无法打开另一个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的新实例,然后退出应用程序)从来没有给我造成任何问题。