【问题标题】:Releasing Excel after using Interop使用 Interop 后发布 Excel
【发布时间】:2014-01-15 12:47:45
【问题描述】:

我已经阅读了很多帖子来寻找我的答案,但都与此类似: Reading excel files in vb.net leaves excel process hanging

我的问题是我没有退出应用程序...

想法是这样的:

如果用户打开了 Excel,如果他打开了我感兴趣的文件...获取该 Excel 实例并做我想做的任何事情...

但我完成后不会关闭他的文件...我希望他继续处理它,问题是当他关闭 Excel 时...进程继续运行...并运行。 .. 并在用户使用 X 按钮关闭 Excel 后运行...

这就是我尝试的方式

这块用来知道他是否打开了Excel,并在For I中检查了我感兴趣的文件名。

    Try
        oApp = GetObject(, "Excel.Application")
        libroAbierto = True
        For Each libro As Microsoft.Office.Interop.Excel.Workbook In oApp.Workbooks
            If libro.Name = EquipoASeccionIdSeccion.Text & ".xlsm" Then
                Exit Try
            End If
        Next
        libroAbierto = False
    Catch ex As Exception
        oApp = New Microsoft.Office.Interop.Excel.Application
    End Try

这将是我的代码...如果他没有打开 Excel,我创建一个新实例,打开文件和其他所有内容。

我的代码以此结尾:

If Not libroAbierto Then
        libroSeccion.Close(SaveChanges:=True)
        oApp.Quit()
    Else
        oApp.UserControl = True
        libroSeccion.Save()
    End If    
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(libroOriginal)
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(libroSeccion)
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(origen)
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(copiada)
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oApp)
    libroOriginal = Nothing
    libroSeccion = Nothing
    oApp = Nothing
    origen = Nothing
    copiada = Nothing
    nuevosGuardados = True

所以你可以看到,如果我打开文件,我会调用 oApp.Quit() 和其他所有操作,Excel 进程会在几秒钟后结束(大约 5 秒)

但如果我的意思是用户保持文件打开(不调用 Quit()),则 Excel 进程会在用户使用 X 按钮关闭 Excel 后继续运行。

有什么办法可以做我想做的事吗?控制一个打开的 excel 实例并释放所有内容,所以当用户使用 X 按钮关闭它时,Excel 进程正常死掉???

谢谢!!!

【问题讨论】:

    标签: excel process interop release


    【解决方案1】:

    在我看来,使用CreateObject 而不是GetObject(, "Excel.Application") 会更好(参见http://support.microsoft.com/kb/288902/enhttp://technet.microsoft.com/en-us/library/ee176980.aspx)。然后在调用FinalReleaseComObject 和assigninh 之前调用Quit 方法就没什么意义了。

    【讨论】:

    • 但是 CreateObject 创建了一个新的 Excel 实例...我想要一个已经打开的 Excel 书...而且,我想在我的应用程序完成使用它时让它保持打开状态...问题就是最后,如果用户关闭 Excel,进程继续运行
    • 如果 Excel 已经在运行,则不应关闭它。如果您只使用 GetObject(, "Excel.Application") 如果 Excel 尚未运行,您将无法启动它。请阅读我在答案中包含的两个参考资料。再说一句。如果您启动应用程序的新实例,它不会占用双倍内存。大多数 DLL 和 EXE 代码将在应用程序之间共享。只需将应用程序的“内存 - 工作集”与“内存 - 私有工作集”进行比较。名称“Memory - ...”是任务管理器中列的名称(适用于 Windows 7)或使用 Process Explorer (www.sysinternals.com)
    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2023-04-06
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多