C# 如何使用getActiveObject(“Excel.Application”)
我需要用C语言完成一个申请 现在我想得到一个函数,它控制Excel文件来获取数据 我使用了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
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#代码将非常接近我所需要的。谢谢。谢谢布莱恩编辑我的答案,让我更容易理解。我正试着这么做,但我不知道怎么做