关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
在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#的反射机制判断。