本文简要描述了利用C#开发一个Word插件的流程方法。实现一个简单的发送邮件的功能。如下图所示:
切换到Visual C#,选择office,可以看到office下面有2010和2007两个版本,为了兼容2007,这里选择2007版本。在工程选项里选择Word 2007 Addin,工程名字填写 SendEmail。工程路径设置成合适的位置。这里还可以在最上面设置.NET Frameword的版本,这里用默认的版本,大家可以根据实际需要选择其他版本。如下图所示:
新建工程后,会看到如下的工程视图:
可以看到工程中有三个(逻辑上的)文件夹,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_Startup
和ThisAddIn_Shutdown
中弹出对话框是非常不好的,这里只是为了演示。实际开发中不应该这样做。另外,时间比较长的初始化操作也不宜放在这里,会影响Word的启动速度。
运行程序之前,我们需要设置需要绑定到调试器的EXE,右键工程->在弹出菜单里选择属性,打开属性页,切换到Debug项,选中Start external program:,找到自己机器上安装的Word路径,Ctrl+S保存。如下图所示:
F5调试运行。可以看到在启动和退出Word时,会弹出消息。
调试结束后删除ThisAddIn_Startup()
和ThisAddIn_Shutdown()
中的代码。
现在这个插件还没有界面,接下来我们需要增加界面。
工程右键,Add,New Item,或者(Ctrl+Shift+A),弹出新加项目对话框,选择Ribbon(Visual Designer),Name填写RibbonEmail.cs,点击Add按钮。如下图所示:
添加新项目后,项目视图如下所示:
可以看到工程中多了三个文件,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区域了。如下图所示:
从上面截图中我们可以看到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已经在开始页签的最前面了。如下如所示:
添加按钮很简单,只需要在工具栏中拖拽Button到Group中就可以了。在按钮的属性页将按钮的Label属性改为发送邮件,name属性改为sendEmail。如下图所示:
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插件的基本流程。有错误的地方欢迎大家指正。