C# 如何使用getActiveObject(“Excel.Application”)

C# 如何使用getActiveObject(“Excel.Application”),c#,excel,C#,Excel,我需要用C语言完成一个申请 现在我想得到一个函数,它控制Excel文件来获取数据 我使用了getActiveObject(“Excel.Application”),但这不会返回任何结果。我不能在VS2008中使用Excel.Application,而是使用Microsoft.Office.Interop.Excel.Application 那么还有别的方法吗 Microsoft.Office.Interop.Excel.Application e = (Microsoft.Office.Inte

我需要用C语言完成一个申请

现在我想得到一个函数,它控制Excel文件来获取数据

我使用了
getActiveObject(“Excel.Application”)
,但这不会返回任何结果。我不能在VS2008中使用
Excel.Application
,而是使用
Microsoft.Office.Interop.Excel.Application

那么还有别的方法吗

Microsoft.Office.Interop.Excel.Application e = (Microsoft.Office.Interop.Excel.Application)Marshal.GetActiveObject("Excel.Application");

为了能够将Excel对象模型称为“Excel”,您可以使用命名空间(或文档)顶部的
语句通过
创建别名,如下所示:

using Excel = Microsoft.Office.Interop.Excel;
此后,您可以参考
Excel.Application
,而不是冗长的
Microsoft.Office.Interop.Excel.Application

至于为什么调用Marshal.GetActiveObject失败,我不能肯定。有几点想法:

(1) 您确定已经存在一个正在运行的Excel实例吗?如果没有,则创建一个新的Excel应用程序:

Excel.Application xlApp = new Excel.Application();
(2) 如果确实有一个Excel应用程序已在运行,那么如果Excel应用程序从未失去焦点,则Excel实例可能尚未添加到运行对象表(ROT)。请参阅:了解更多信息。我相信Marshal.GetActiveObject方法在这种情况下应该抛出一个异常——而不是悄悄地返回null——但这似乎仍然有潜在的相关性

我希望这有助于


迈克

在玩了大约半天之后,我终于想出了如何实现这一点,这样你就可以锁定打开的excel副本。我的用户一直强烈抱怨Excel打开的实例太多

以下是我为使其正常工作所做的一小段工作:

_Application excelApp;

try
{
  excelApp = (_Application)Marshal.GetActiveObject("Excel.Application");
}
catch(Exception)
{
  // this is important. If Excel is not running, GetActiveObject will throw
  // an exception
  excelApp = null;
}

if( excelApp == null )
{
  excelApp = new ApplicationClass();
}

我花了一段时间研究这个问题,终于有时间坐下来解决了。

请查看下面链接中给出的MS KB


我也一直在使用Excel加载项,在名称空间中使用

using Excel=Microsoft.Interop.Office.Excel;
请使用上面的一行,而不是Microsoft.Interop.Office.Excel,了解更多信息,请查看我的代码:

using System.IO;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Interop.Excel;
using static MMCAPP2010.Profile;
using System.Runtime.InteropServices;

namespace MMCAPP2010
{
    public class ExcelTemplateLoad
    {
        public void DeserializeObject(string filename)
        {
            Excel.Application instance;
            Workbook wb = null;
            try
            {
                //getting the current running instance of an excel application
                instance = (Excel.Application)Marshal.GetActiveObject("Excel.Application");   
            }
            catch
            {
                instance = new Excel.Application();
            }

            //opening the template
            wb = instance.Workbooks.Open(@"C:\Users\U1152927\Downloads\sample.xltx");

我试图用ActiveQt对象和C++/CLI包装器表单做同样的事情。我认为C#代码将非常接近我所需要的。谢谢。谢谢布莱恩编辑我的答案,让我更容易理解。我正试着这么做,但我不知道怎么做