2017-09-18 63 views
0

我試圖讓Excel應用程序在我的代碼用這種方法:如何在C#中獲取Excel.Application實例?

Excel.Application xlApp = GetApplication(); 
if (xlApp == null) xlApp = new Excel.Application(); 

其中

private Excel.Application GetApplication() 
    { 
     Excel.Application result = null; 

     try 
     { 
      result = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 
     } 
     catch (System.Runtime.InteropServices.COMException ex) 
     { 
      //Excel is not open 
     } 

     return result; 
    } 

System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") 總是拋出異常,即使Excel應用程序是開放的。

異常:HRESULT:0x800401E3

堆棧跟蹤:

in System.Runtime.InteropServices.Marshal.GetActiveObject(Guid& rclsid, IntPtr reserved, Object& ppunk) 
    in System.Runtime.InteropServices.Marshal.GetActiveObject(String progID) 
    in RaceToolTests.UnitTest1.GetApplication() in C:\Users\... 
+0

您是否使用_only_互操作或者您也使用ClosedXML吧?你有一行'使用Excel = Microsoft.Office.Interop.Excel;'我問,因爲你的代碼對我來說工作得很好。 – LocEngineer

+0

我只使用Interop。在我的代碼中,我添加了:'使用Excel = Microsoft.Office.Interop.Excel;' – KentuckyJack92

+1

您的Excel版本是否與Interop版本匹配Excel 2010爲14.0還是2016爲16.0?你使用什麼版本? – LocEngineer

回答

0

請嘗試以下代碼:

//import 
using Excel = Microsoft.Office.Interop.Excel; 

//define 
Excel.Application xlApp; 
Excel.Workbook xlWorkBook; 
Excel.Worksheet xlWorkSheet; 

private void openXL() 
{ 

    string fileName = "PATH\\FILE_NAME.xlsx"; ; 

    xlApp = new Excel.Application(); 
    xlWorkBook = xlApp.Workbooks.Open(fileName); 
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 
} 
+0

我已經有一個Excel實例打開了。 d喜歡獲取該實例而不是打開一個新實例。 – KentuckyJack92

+0

是你的「xlApp」公共還是全球?如果它是全球性的或公開的,你可以使用 – imsome1

+0

也許我提出了一個令人困惑的問題。重點是我需要以編程方式更新必須在Excel中打開而不更改其路徑的文件。爲此,我想在Excel中關閉並保存並重新打開它。這就是爲什麼我想要一種方法來識別託管我感興趣的文件的Excel實例(也許在各種不同的Excel實例中)。 – KentuckyJack92