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

时间:2009-08-27 10:27:07

标签: c# excel

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

4 个答案:

答案 0 :(得分:3)

经过大约半天的游戏,我终于想出了如何使这项工作,所以你可以锁定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();
}

我一直在追逐这一段时间,最后有时间蹲下来想出来。

答案 1 :(得分:1)

为了能够将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 - 但这似乎仍然可能相关。

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

麦克

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

我还一直在使用命名空间使用Excel Addins

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");
相关问题