2014-07-17 40 views
2

我想构建一个允许用户选择以前打开的Excel实例的表单。从进程ID获取打开的xlsx文件名

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

我怀疑我不得不使用COM将它从它那里拿出来,但我还没有找到办法做到这一点。

我想的代码如下:

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

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

任何帮助,将不胜感激

+0

http://stackoverflow.com/questions/7916711/get-the -current-workbook-object-in-c-sharp –

+0

让我知道如果上述问题解决了您的问题,以便我可以将此问题标记为重复项:D –

回答

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) 
     { 

     } 
+0

OpenApplications中的每个Process对象的.ActiveWorkbook.Name他们?我没有看到。 –

0

首先,你必须添加到Microsoft Excel Object Library参考,以获得运行MS Excel应用程序的一个实例:

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

然后你就可以通过ActiveWorkbook获取该文件的完整路径和FullName属性。

Console.WriteLine(application.ActiveWorkbook.FullName); 

如果你有多个实例的MS Excel中打开,您可以通过Workbooks属性遍历它们:

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

当我执行var应用程序时出现异常= ... 另外,如果存在多个打开的工作簿,该怎么办?我试图让用户选择活动的... –

+0

@TimC,这不是一个非常丰富的描述发生了什么。确保使用与MS Excel的目标版本相对应的版本的对象库;尝试在网络上搜索异常消息中描述的问题;如果没有帮助,可以提出一个新问题,但请确实包含所有相关信息,[一些提示](http://stackoverflow.com/help/mcve)。 – Yuriy