C# 如何列出所有打开的Excel工作簿
我正在用.NET4.7.1编写一个c#控制台应用程序。我的电脑上有几本打开的Excel工作簿。我正在尝试列出计算机上所有打开的Excel工作簿 我看过几篇SO文章,并将这些代码放在一起,这些代码应该列出我计算机上所有打开的Excel工作簿,但当我运行代码时 未列出任何打开的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
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");