如何使用getActiveObject(“Excel.应用程序”)

brccelvz  于 2022-12-01  发布在  其他
关注(0)|答案(4)|浏览(288)

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

6mzjoqzu1#

经过大约半天的练习,我终于找到了如何使它工作,这样你就可以锁定一个打开的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();
}

我已经追了一段时间了,终于有时间蹲下来想办法了。

ebdffaop

ebdffaop2#

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

kx7yvsdv3#

为了能够将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)中。请参阅:我相信Marshal.GetActiveObject方法在这种情况下应该抛出一个异常--而不是安静地返回null --但这似乎仍然有潜在的相关性。
我希望这能帮上忙...
麦克

相关问题