xlApp.ActiveWorkbook返回null

时间:2014-06-20 20:14:22

标签: c# excel interop ribbon

我有一个2010 Excel功能区加载项。当您按下按钮时,它只会将一些数据行写入excel应用程序。为了编写这些数据,我需要获取活动工作表。为了获得活动工作表,我需要activeWorkBook。我可以使用

获得xlApp
xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

它检索xlApp很好但每当我尝试获取活动工作簿时它返回null。无论。除非我重新启动计算机。然后它工作,但只是第一次。下面是上下文中的整个代码块。我想知道如何修复xlApp.ActiveWorkBook为空。这样我就可以得到活动的工作表。然后将数据写入活动工作表。

public void sendData()
    {
        Excel.Application xlApp = null;
        Excel.Workbook xlWorkBook = null;
        Excel.Workbooks xlWorkBooks = null;
        Excel.Worksheet xlWorkSheet = null;
        object misValue = System.Reflection.Missing.Value;

        try
        {
            xlApp = new Excel.Application();
            //xlWorkBooks = xlApp.Workbooks;
            //xlWorkBook = xlWorkBooks.Add(Properties.Settings.Default.FileToSend);
            //xlWorkSheet = xlWorkBook.Sheets[1];

            xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
            xlWorkBook = (Excel.Workbook)xlApp.ActiveWorkbook;
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.ActiveSheet;
        }
        catch (Exception ex)
        {
            // handle error...
        }
        finally
        {
            if (xlWorkSheet != null)
                Marshal.ReleaseComObject(xlWorkSheet);

            if (xlWorkBook != null)
                Marshal.ReleaseComObject(xlWorkBook);

            if (xlWorkBooks != null)
                Marshal.ReleaseComObject(xlWorkBooks);

            if (xlApp != null)
                Marshal.ReleaseComObject(xlApp);
        }

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可能通过拨打GetActiveObject来获取错误的Excel实例。使用传递到COM加载项OnConnection的应用程序引用(或者您的功能区代码是自举的)。

如果您正在使用Excel-DNA框架制作托管Excel加载项,那么您可以通过调用ExcelDnaUtil.Application来获取正确的Application对象。