关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
VSTO若要获取相关的Office对象,需要通过Globals去获取:
//引用部分 using Excel = Microsoft.Office.Interop.Excel; //代码部分 Excel.Application app = Globals.ThisAddIn.Application;
作为一个插件,肯定有很多地方会使用Office对象。那么要写很多次Globals?而且有时还要获取一些常用的获取Office相关对象或执行常用的功能。这种情况,最好把获取Office对象或一些常用的方法封装成一个类。
先架一个构造函数:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Excel = Microsoft.Office.Interop.Excel; namespace Excel_addin //命名空间根据自己的修改 { public class ClsExcelObject { //构造函数 public ClsExcelObject(Excel.Application app) { this.App = app } //属性 public Excel.Application App {get; set; } } }
这里需要传递一个Excel的Application对象作为参数。
有人问,直接使用Globals获取不行吗?你想想每次获取一个Application对象,要写很长一串代码,写起来得多累。
而且出于减低耦合性的考虑,所以这里不建议。
另外,一个VSTO项目可能会拆分成多个dll。除了最底层的dll之外,其他的dll会使用不到Globals该对象。
你可以选中Globals,再按一下F12键,找到Globals定义的位置。如下图:
可以发现该Globals对象是在ThisAddin.cs该文件中的,而该ThisAddin.cs是VSTO的项目文件。上面几个项目,都是我在该解决方案下创建的。没有ThisAddin.cs文件,则无法使用Globals。
所以,这里最好少直接使用Globals对象。在使用其他dll中的时候,传递一个Excel Application对象即可。
最后,上代码获取常用对象代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Excel = Microsoft.Office.Interop.Excel; namespace Excel_addin //命名空间根据自己的修改 { public class ClsExcelObject { //构造函数 public ClsExcelObject(Excel.Application app) { this.App = app } //属性 /// <summary> /// 获取或设置Excel的Application /// </summary> public Excel.Application App {get; set; } /// <summary> /// 获取当前工作簿 /// </summary> public Excel.Workbook ThisWorkbook { get { return App.ActiveWorkbook;} } /// <summary> /// 获取当前工作簿 /// </summary> public Excel.Worksheet ActiveSheet { get { return App.ActiveSheet;} } /// <summary> /// 获取或设置是否刷新界面 /// </summary> public bool ScreentUpdate { get { return App.ScreenUpdating; } set { App.ScreenUpdating = value; } } /// <summary> /// 获取或设置是否开启系统警告 /// </summary> public bool DisplayAlerts { get { return App.DisplayAlerts; } set { App.DisplayAlerts = value; } } /// <summary> /// 获取或设置是否显示公式 /// </summary> public bool DisplayFormulas { get { if (App.ActiveWindow == null) { return false; } else { return App.ActiveWindow.DisplayFormulas; } } set { try { if (App.ActiveWindow != null) App.ActiveWindow.DisplayFormulas = value; } catch { } } } } }
当然,我常用的方法不止这一些。我自己写的东西有点多:
近7百多行代码。这里篇幅有限,就不放出来了。有些代码后面会陆续写出来。