C#开发Word控件

简介

本文简要描述了利用C#开发一个Word插件的流程方法。实现一个简单的发送邮件的功能。如下图所示:


C#开发Word控件_第1张图片

点击发送邮件按钮,则将文本内容发送到邮箱。

新建工程

切换到Visual C#,选择office,可以看到office下面有2010和2007两个版本,为了兼容2007,这里选择2007版本。在工程选项里选择Word 2007 Addin,工程名字填写 SendEmail。工程路径设置成合适的位置。这里还可以在最上面设置.NET Frameword的版本,这里用默认的版本,大家可以根据实际需要选择其他版本。如下图所示:


C#开发Word控件_第2张图片

点击OK。

工程文件解析

新建工程后,会看到如下的工程视图:


C#开发Word控件_第3张图片

可以看到工程中有三个(逻辑上的)文件夹,Properties里存放的是应用的资源和配置,References里是工程中所有引入的库,展开后可以看到很多库是关于Office的。Word下面则是我们需要的文件。在这里仅有一个文件ThisAddIn.cs,打开它,代码如下(略去无关部分):

//...
namespace SendEmail
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        // ...
}

可以看到ThisAddIn类和它的两个方法ThisAddIn_Startup()ThisAddIn_Shutdown()ThisAddIn这个类是VS创建的,用来和Office程序(Word)通信。这个类对象的初始化发生在Office程序加载控件的时候。它的基类是AddIn。

ThisAddIn_Startup()在控件加载完成时调用,我们可以在这个方法里写自己的初始化代码。
ThisAddIn_Shutdown()在控件销毁时调用,我们可以在这个方法理写自己的销毁代码。

为了测试这两个方法,在这两个函数里增加一些代码,分别弹出两条信息:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    System.Windows.Forms.MessageBox.Show("Addin startup");
}

private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
    System.Windows.Forms.MessageBox.Show("Addin shutdown");
}

ThisAddIn_StartupThisAddIn_Shutdown中弹出对话框是非常不好的,这里只是为了演示。实际开发中不应该这样做。另外,时间比较长的初始化操作也不宜放在这里,会影响Word的启动速度。

测试程序

运行程序之前,我们需要设置需要绑定到调试器的EXE,右键工程->在弹出菜单里选择属性,打开属性页,切换到Debug项,选中Start external program:,找到自己机器上安装的Word路径,Ctrl+S保存。如下图所示:


C#开发Word控件_第4张图片

F5调试运行。可以看到在启动和退出Word时,会弹出消息。
调试结束后删除ThisAddIn_Startup()ThisAddIn_Shutdown()中的代码。

添加界面

现在这个插件还没有界面,接下来我们需要增加界面。
工程右键,Add,New Item,或者(Ctrl+Shift+A),弹出新加项目对话框,选择Ribbon(Visual Designer),Name填写RibbonEmail.cs,点击Add按钮。如下图所示:


C#开发Word控件_第5张图片

添加新项目后,项目视图如下所示:


C#开发Word控件_第6张图片

可以看到工程中多了三个文件,RibbonEmail.cs、RibbonEmail.Email.Designer.cs和SendEmail_TemporaryKey.pfx。SendEmail_TemporaryKey.pfx是给程序集签名用的,我们这里不讨论。RibbonEmail.Email.Designer.cs是由窗体设计器生成和维护的,用来放置生成界面的代码,一般我们不用理睬。RibbonEmail.cs是放置处理Ribbon事件代码的文件,我们的代码逻辑便放在此文件中,这个文件可以通过两种方式打开:View Code和View Designer,鼠标右键点击这个文件就可以看到这两个选项。选择View Designer会打开设计界面,我们在这里拖拽控件,设置控件属性和事件。View Code则会打开代码编辑器,我们在这里编写代码逻辑。现在这里仅有一个方法RibbonEmail_Load,这是VS自动生成的代码,Ribbon加载时会调用此函数,可以在这个函数里写初始化代码。现在以Designer视图打开 RibbonEmail.cs。可以看到设计器已经为我们生成了一个Ribbon界面,包括一个RibbonTab和一个RibbonGroup。
RibbonTab是一个包含了一个或多个RibbonGroup的控件。
RibbonGroup用来将控件分组,可以将任意多个控件放置在一个RibbonGroup中。

F5运行程序,可以看到,我们的控件已经加载到Word的Ribbon区域了。如下图所示:


C#开发Word控件_第7张图片

调整控件位置

从上面截图中我们可以看到RibbonTab的位置出现在了最后面,Tab标签为加载项。我们可以通过RibbonTab的属性将其设置到任何位置。打开RibbonTab属性页,可以看到ControlId属性。ControlId控制着Tab的位置,其中又有两个子属性,ControlIdType和OfficeId。ControlIdType可以为Office或者Custom,Office表示我们的页签需要放在Office提供的页签中。Custom则为我们自定义的页签。这里选择Office。OfficeId表示Office提供的页签的Id,关于这个Id的说明,可以下载官方的ID文档查看。这里我们填写TabHome,表示我们要将我们的控件加到开始页签中。

F5运行程序,我们的空间已经在开始页签中了。不过RibbonGroup还是在最后面。

可以通过RibbonGroup的Position属性改变其位置。Position属性描述控件出现的位置,有三个可选值,Default,BeforeOfficeId,AfterOfficeId。Default表示放在最后。BeforeOfficeId表示放在某个控件之前。AfterOfficeId表示放在某个控件之后。这里我们选择BeforeOfficeId。OfficeId则为某个控件的Id,仍然可以在官方的ID文档中查找。这里我们填写GroupClipboard,表示放在剪贴板前面。

再次运行程序,我们的RibbonGroup已经在开始页签的最前面了。如下如所示:


C#开发Word控件_第8张图片

添加按钮,处理事件

添加按钮很简单,只需要在工具栏中拖拽Button到Group中就可以了。在按钮的属性页将按钮的Label属性改为发送邮件,name属性改为sendEmail。如下图所示:


C#开发Word控件_第9张图片

切换到事件页签,双击Click右边的输入框,则会自动创建事件处理器,并跳转到相应的代码。如下图所示:

C#开发Word控件_第10张图片

接下来就是处理发送邮件的代码逻辑了。完整代码如下:

private void sendEmail_Click(object sender, RibbonControlEventArgs e)
        {
            // 获取当前文档文本
            string text = Globals.ThisAddIn.Application.ActiveDocument.Content.Text;

            // 创建消息对象,四个参数为from,to,subject,body
            System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(
                "[email protected]", "[email protected]", "From Word", text);
            // 创建Smtp客户端,参数为SMTP服务器和端口
            System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("smtp.126.com", 25);
            // 设置凭证,参数为用户名和密码
            client.Credentials = new System.Net.NetworkCredential("[email protected]", "password");
            // 异步发送邮件,第一个参数为消息,第二个参数为发送成功后调用的对象,这里设置为null
            client.SendAsync(message, null);
        }

总结

本篇文章讲述了如何利用C#开发Word插件的基本流程。有错误的地方欢迎大家指正。

你可能感兴趣的:(c#)