【问题标题】:How to list all open Excel workbooks如何列出所有打开的 Excel 工作簿
【发布时间】: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


【解决方案1】:

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

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

到:

 Application oXL = (Application)Marshal.GetActiveObject("Excel.Application");

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

【讨论】:

  • 知道为什么当打开的 Excel 工作簿处于受保护的视图中时,oXL.Workbooks.Count = 0 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多