2014-07-17 41 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