【问题标题】:How to use getActiveObject("Excel.Application")如何使用 getActiveObject("Excel.Application")
【发布时间】:2019-05-18 06:32:05
【问题描述】:

我需要用 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");

【问题讨论】:

    标签: c# excel


    【解决方案1】:

    在玩了大约半天之后,我终于弄清楚了如何进行这项工作,以便您可以锁定打开的 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();
    }
    

    我已经追了一段时间了,终于有时间蹲下来弄清楚了。

    【讨论】:

    • 我正在尝试对 ActiveQt 对象和 C++/CLI 包装器表单做同样的事情。我认为 C# 代码将非常接近我所需要的。谢谢。
    【解决方案2】:

    我也一直在研究 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");
    

    【讨论】:

    • 感谢布赖恩将我的答案编辑得更容易理解,我试图这样做,但我不知道该怎么做
    【解决方案3】:

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

    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)。有关更多信息,请参阅:Visual C# .NET Error Attaching to Running Instance of Office Application。我相信 Marshal.GetActiveObject 方法在这种情况下应该抛出一个异常——而不是悄悄地返回 null——但这似乎仍然具有潜在的相关性。

    我希望这会有所帮助...

    迈克

    【讨论】:

      【解决方案4】:

      请参阅下面链接中给出的 MS KB...

      http://support.microsoft.com/kb/238610

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-18
        • 2022-01-16
        • 2015-01-17
        • 2019-04-12
        • 1970-01-01
        • 2023-03-29
        • 2019-08-25
        • 2023-03-23
        相关资源
        最近更新 更多