2017-09-18 64 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