C# 如何列出所有打开的Excel工作簿

C# 如何列出所有打开的Excel工作簿,c#,excel-interop,C#,Excel Interop,我正在用.NET4.7.1编写一个c#控制台应用程序。我的电脑上有几本打开的Excel工作簿。我正在尝试列出计算机上所有打开的Excel工作簿 我看过几篇SO文章,并将这些代码放在一起,这些代码应该列出我计算机上所有打开的Excel工作簿,但当我运行代码时 未列出任何打开的Excel工作簿 using System; using System.Runtime.InteropServices; using Microsoft.Office.Interop.Excel; namespace Exc

我正在用.NET4.7.1编写一个c#控制台应用程序。我的电脑上有几本打开的Excel工作簿。我正在尝试列出计算机上所有打开的Excel工作簿

我看过几篇SO文章,并将这些代码放在一起,这些代码应该列出我计算机上所有打开的Excel工作簿,但当我运行代码时 未列出任何打开的Excel工作簿

using System;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

namespace ExcelWorkbooks
{
    class Program
    {
        static void Main(string[] args)
        {
            Application oXL = new Microsoft.Office.Interop.Excel.Application();
            oXL = (Application)Marshal.GetActiveObject("Excel.Application");
            Console.WriteLine("starting");
            foreach (Microsoft.Office.Interop.Excel.Workbook blah in oXL.Workbooks)
            {
                Console.WriteLine(blah.Name.ToString());
            }
            Console.WriteLine("ending");
            Console.ReadLine();
        }
    }
}
输出应该是

开始

这里应该有一个打开的Excel工作簿列表

结束

但这就是输出

开始

结束

如果有人能为我指出代码中需要添加/删除或更改的内容的正确方向,以便它能列出我计算机上所有打开的Excel工作簿,我将不胜感激。提前谢谢


编辑:我正在玩这个,我关闭了打开的两个Excel工作簿。然后我查看任务管理器,发现即使在我关闭了所有Excel工作簿之后,仍有大约10个“Excel”进程在运行。我关闭了所有“EXCEL”流程,然后再次打开了2个EXCEL工作簿。现在,上面的代码列出了2个打开的Excel工作簿。因此,我想问题已经有所改变,为什么在我只有两个打开的工作簿时,有10个“EXCEL”进程在运行,更重要的是,我应该如何处理这个问题,如果有其他“EXCEL”进程,我可以处理它,这样它就会显示打开的EXCEL工作簿。谢谢。

要列出当前Excel实例工作簿名称,只需更改:

Application oXL = new Microsoft.Office.Interop.Excel.Application();
oXL = (Application)Marshal.GetActiveObject("Excel.Application");
致:


您可能需要添加一些Try/Catch块来处理没有可用Excel实例的情况

Application oXL=new Microsoft.Office.Interop.Excel.Application();oXL=(应用程序)Marshal.GetActiveObject(“Excel.Application”)为什么要设置两次
oXL
?您认为新的Microsoft.Office.Interop.Excel.Application()
有什么作用?关于第二个问题(Excel的多个实例),您没有正确清理@mjwills提到的使用
oXL
两个单独设置创建的多个实例。修复代码中的逻辑错误,这样您就可以检索打开的实例,而不是创建一个新实例并首先丢弃它-您要丢弃的实例不会被关闭,因为在将它们扔到一边之前您不会关闭它们。为了澄清这一点,
new
启动一个新的Excel实例;它没有得到活动的。然后获取该刚启动实例的另一个引用,并在
new
之后丢弃已有的引用。该新实例没有打开的工作簿,因此会得到一个空列表。如果您关闭应用程序,然后查看Task Manager,您将拥有两份Excel。再次运行代码,关闭它,然后查看任务管理器,您将拥有另一个打开的Excel副本。重复一遍,看看Excel进程的数量继续增加。你的代码对我来说很有用。请检查是否存在程序集版本不匹配。@KenWhite感谢您的见解,我不知道是什么原因造成的。正如我在编辑中所说,在我删除了Excel进程的所有额外实例之后,我能够列出打开的工作簿,我认为这是阻止我的代码执行我想做的事情的首要问题。知道为什么打开的Excel工作簿处于保护状态时,
oXL.workbooks.Count
=
0
看法
 Application oXL = (Application)Marshal.GetActiveObject("Excel.Application");