【问题标题】:Getting open xlsx Filename from Process ID从进程 ID 获取打开的 xlsx 文件名
【发布时间】:2014-07-17 19:05:23
【问题描述】:

我正在尝试构建一个允许用户选择以前打开的 Excel 实例的表单。

从那里,我想提取与打开的实例关联的.xlsx 文件的名称。

我怀疑我必须使用 COM 将其从那里取出,但我还没有找到方法。

我想的代码如下:

Process[] openApplications = Process.GetProcessesByName("excel");

foreach(Process p in openApplications)
{
    ///Find the associated .xlsx path and file
    ///...Maybe from the handle id?
}

任何帮助将不胜感激

【问题讨论】:

标签: c# excel file


【解决方案1】:

您必须使用ActiveWorkbook 属性。 请参考this

        try
        {
            Process[] openApplications = Process.GetProcessesByName("excel");
            int proLen = openApplications.Length;
            if (proLen == 0)
            {
                Console.WriteLine("The process does NOT exist or has exited...");
                return 0;
            }

            foreach(Process p in openApplications)
             {
             //validate p for null/nothing
             //get the name of the workbook using
             //Use p.ActiveWorkbook.Name to get the file name.
             }        
            return 1;
        }
        catch (Exception ex)
        {

        }

【讨论】:

  • openApplications 中的每个 Process 对象是否都有一个 .ActiveWorkbook.Name ?我没看到。
  • 我正在使用 VS2017 - 这个答案似乎不起作用。 p.ActiveWorkbook.Name 不是有效的选择
【解决方案2】:

首先,您必须添加对 Microsoft Excel Object Library 的引用,以获取正在运行的 MS Excel 应用程序的实例:

var application = (Application)Marshal.GetActiveObject("Excel.Application");

然后你可以通过ActiveWorkbookFullName属性获取文件的完整路径。

Console.WriteLine(application.ActiveWorkbook.FullName);

如果您打开了多个 MS Excel 实例,您可以通过Workbooks 属性对其进行迭代:

foreach (Workbook workbook in application.Workbooks)
{
    // do something with workbook.FullName
}

【讨论】:

  • 我在执行 var application = ... 时遇到异常... 另外,如果有多个打开的工作簿,我该怎么办?我正在尝试让用户选择活动的...
  • @TimC,这不是对正在发生的事情的非常丰富的描述。确保使用与 MS Excel 目标版本对应的版本的对象库;尝试在网上搜索异常消息中描述的问题;如果没有帮助,您可以提出一个新问题,但请务必提供所有相关信息,some tips
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多