关于本站
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#的反射机制判断。