VSTO获取公共对象:Excel篇

  • 发布时间:2016年11月18日 12:06
  • 作者:杨仕航
  • 分类标签: VSTO
  • 阅读(8406)
  • 评论(0)

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定义的位置。如下图:

20170123/20170123111903235.png

可以发现该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百多行代码。这里篇幅有限,就不放出来了。有些代码后面会陆续写出来。

上一篇:VSTO获取公共对象:Word篇

下一篇:Django一些有用的admin设置

评论列表

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

新的评论

清空