VSTO判断选中的对象是否是单元格

在Excel开发VSTO插件中,有些功能是针对单元格进行操作。

例如,合并单元格、拆分单元格、提取单元格中的内容等等。

若你设计的操作模式是选中单元格再操作的话,这里就需要判断到底选中的对象是不是单元格。

若选中的对象是图表、图形等等,继续执行代码会出错。

我们可以在执行操作之前,先判断选择的对象是否是单元格。

Excel有个系统对象可以获取选中的对象:Selection。

但问题又来了,在Excel对象模型中Selection是执行的时候才分析。

而C#又是强类型语言,不能直接判断Selection是否是Range类型。

我们可以通过如下代码判断:

using System;
using Excel = Microsoft.Office.Interop.Excel;

namespace Excel_Addin
{
    public class ClsExcelObj
    {
        public bool check_is_range()
        {
            object select = Globals.ThisAddIn.Application.Selection;
            return (select as Excel.Range) != null;
        }
    }    
}

该方法利用C#的多态。

若Seletion是Range对象,可以用as关键字将Selection转成Range对象。

若Selection不是Range对象,使用as关键字将得到null。

所以,再判断结果是否为null即可判断Selection是否为Range对象。

拓展一下,若我想判断其他类型呢?总不能每种类型都写一个判断函数吧!

先添加一个枚举:

public enum EnumSelectionType { UnKnow, Range, Rectangle, ChartObject, ChartArea }

这些枚举对应未知类型、单元格、形状、图表、图表区域等类型。

再写一个判断函数:

using System;
using Excel = Microsoft.Office.Interop.Excel;

namespace Excel_Addin
{
    public class ClsExcelObj
    {
        public EnumSelectionType GetSelectionType()
        {
            object select = Globals.ThisAddIn.Application.Selection;
            
            if ((select as Excel.Range) != null)
            {
                return EnumSelectionType.Range;
            }
            else if ((select as Excel.Rectangle) != null)
            {
                return EnumSelectionType.Rectangle;
            }
            else if ((select as Excel.ChartObject) != null)
            {
                return EnumSelectionType.ChartArea;
            }
            else if ((select as Excel.ChartArea) != null)
            {
                return EnumSelectionType.ChartObject;
            }
            else
            {
                return EnumSelectionType.UnKnow;
            }
        }
    }    
}

该方法可以返回对应的Selection类型。

可以如下使用方法,例如判断是否为单元格:

ClsExcelObj clsExcelObj = new ClsExcelObj();
if (clsExcelObj.GetSelectionType() == EnumSelectionType.Range)
{
    ;//Selection是单元格
}
else
{
    ;//Selection不是单元格
}

当然,你也可以尝试用C#的反射机制判断。

评论列表

暂无评论,欢迎来抢沙发!

新的评论

清空