【发布时间】:2018-12-27 16:17:03
【问题描述】:
我正在使用 .net 4.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 工作簿,我将不胜感激。提前致谢。
编辑:我正在玩这个,我关闭了 2 个打开的 Excel 工作簿。然后我查看了任务管理器,发现即使在我关闭了所有 Excel 工作簿之后,仍有大约 10 个“EXCEL”进程仍在运行。我关闭了所有“EXCEL”进程,然后再次打开了 2 个 Excel 工作簿。现在上面的代码列出了 2 个打开的 Excel 工作簿。所以,我想问题已经有所改变,为什么当我只有 2 个打开的工作簿时有 10 个“EXCEL”进程正在运行,更重要的是我应该如何处理这个问题,所以如果有额外的“EXCEL”进程我可以处理这个因此它将显示打开的 Excel 工作簿。谢谢。
【问题讨论】:
-
Application oXL = new Microsoft.Office.Interop.Excel.Application(); oXL = (Application)Marshal.GetActiveObject("Excel.Application");为什么要设置oXL两次?你觉得new Microsoft.Office.Interop.Excel.Application()是做什么的? -
关于您的第二个问题(Excel 的多个实例),您没有正确清理使用@mjwills 提到的
oXL的两个单独设置创建的多个实例。修复代码中的逻辑错误,这样您就可以检索打开的实例,而不是先创建一个新实例并丢弃它 - 您要丢弃的实例不会被关闭,因为您在扔掉它们之前不会关闭它们放在一边。 -
澄清一下,
new启动一个新的 Excel 实例;它没有得到活跃的。然后,您获取该刚刚开始的实例的另一个引用,丢弃在new之后已有的引用。该新实例没有打开的工作簿,因此您得到一个空列表。如果您关闭应用程序,然后查看任务管理器,您将拥有两个 Excel 副本。再次运行您的代码,将其关闭,然后查看任务管理器,您将拥有另一个打开的 Excel 副本。重复,并观察 Excel 进程的数量继续增加。 -
您的代码对我有用。请检查是否存在程序集版本不匹配。
-
@KenWhite 感谢您的洞察力,我不知道是什么原因造成的。正如我在编辑中所说,在我杀死了 Excel 进程的所有额外实例后,我能够列出打开的工作簿,我相信这是阻止我的代码首先做我想做的事情的问题。
标签: c# excel-interop