Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用应用程序级别的VSTO加载项在Excel 2010中删除图表表?_Excel_Vsto - Fatal编程技术网

如何使用应用程序级别的VSTO加载项在Excel 2010中删除图表表?

如何使用应用程序级别的VSTO加载项在Excel 2010中删除图表表?,excel,vsto,Excel,Vsto,我有一个Excel 2010的应用程序级加载项。我需要能够从工作簿中删除工作表和图表。使用以下代码删除工作表不是问题: Worksheet wsDel = (Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[WorksheetName]; wsDel.Delete(); object TheObject = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSh

我有一个Excel 2010的应用程序级加载项。我需要能够从工作簿中删除工作表和图表。使用以下代码删除工作表不是问题:

Worksheet wsDel = (Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[WorksheetName];
wsDel.Delete();
object TheObject = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet;
for (int i = 1; i <= Globals.ThisAddIn.Application.ActiveWorkbook.Charts.Count; i++)
            {
                Debug.WriteLine("The type is '{0}'", Globals.ThisAddIn.Application.ActiveWorkbook.Charts[i]);
                object TempObject = Globals.ThisAddIn.Application.ActiveWorkbook.Charts[i];

                if (TheObject == TempObject)
                {
                    Debug.WriteLine("Eureka!");
                }
            }
然而,删除图表工作表是一个问题,因为我无法将它们转换为“图表工作表”对象。我正在尝试以下代码:

Worksheet wsDel = (Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[WorksheetName];
wsDel.Delete();
object TheObject = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet;
for (int i = 1; i <= Globals.ThisAddIn.Application.ActiveWorkbook.Charts.Count; i++)
            {
                Debug.WriteLine("The type is '{0}'", Globals.ThisAddIn.Application.ActiveWorkbook.Charts[i]);
                object TempObject = Globals.ThisAddIn.Application.ActiveWorkbook.Charts[i];

                if (TheObject == TempObject)
                {
                    Debug.WriteLine("Eureka!");
                }
            }
“TempObject”的类型为“\uu ComObject”。你知道我可以在Debug.WriteLineEureka行中强制转换它以删除它吗

问候,,
首先,我建议打破调用链,在单独的代码行中声明每个属性或方法调用。因此,您将能够立即释放每个底层COM对象。用于在使用完Excel对象后释放该对象。然后在C中的Visual Basic null中将变量设置为Nothing,以释放对对象的引用。您可以在MSDN中的文章中阅读更多关于这方面的内容。它与Outlook相关,但相同的原则可以应用于所有Office应用程序

您可以使用IDispatch和ITypeInfo接口获取基础类型:

将对象强制转换为IDispatch类型。 通过IDispatch.GetTypeInfo获取ITypeInfo接口。 使用ITypeInfo.GetDocumentation获取类型名称

public static string GetTypeName(object comObj)
{

    if (comObj == null)
        return String.Empty;

    if (!Marshal.IsComObject(comObj))
        //The specified object is not a COM object
        return String.Empty;

    IDispatch dispatch = comObj as IDispatch;
    if (dispatch == null)
        //The specified COM object doesn't support getting type information
        return String.Empty;

    ComTypes.ITypeInfo typeInfo = null;
    try
    {
        try
        {
            // obtain the ITypeInfo interface from the object
            dispatch.GetTypeInfo(0, 0, out typeInfo);
        }
        catch (Exception ex)
        {
            //Cannot get the ITypeInfo interface for the specified COM object
            return String.Empty;
        }

        string typeName = "";
        string documentation, helpFile;
        int helpContext = -1;

        try
        {
            //retrieves the documentation string for the specified type description 
            typeInfo.GetDocumentation(-1, out typeName, out documentation,
                out helpContext, out helpFile);
        }
        catch (Exception ex)
        {
            // Cannot extract ITypeInfo information
            return String.Empty;
        }
        return typeName;
    }
    catch (Exception ex)
    {
        // Unexpected error
        return String.Empty;
    }
    finally
    {
        if (typeInfo != null) Marshal.ReleaseComObject(typeInfo);
    }
}
有关更多信息,请参阅