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

  • 发布时间:2017年3月14日 17:25
  • 作者:杨仕航
  • 分类标签: VSTO
  • 阅读(7258)
  • 评论(0)

在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#的反射机制判断。

上一篇:我的网站搭建(第48天) OAuth登录自动获取头像

下一篇:为什么我的Excel公式不计算

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空