WORD二次开发
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 当我们在博客列表中选择某个博客时,它会通过 RSS 获取该博客最近发布的帖子,并且填充 lbxRecentPosts 控件;
2. 当我们在博客列表中选择某个博客时,它会读取该博客帖子草稿文件夹里的数据,并且填充 lbxDrafts 控件;
3. 当我们在博客列表中选择某个博客时,按下 View Blog 按钮将会在 Internet Explorer 中打开该博客的主 页;
Figure 4
完成了这些操作之后,你的 Visual Studio 2008 Beta 2 应该会是这样的:
Figure 5
现在,我们来看看运行效果:
Figure 6
打开/关闭"我的博客"侧边栏
My Blogs 按钮的实现主要有如下要求: Word 2007 启动的时候,"我的博客"侧边栏会被加载但不显示。 当 My Blogs 按钮处于按下状态时,显示"我的博客"侧边栏;当 My Blogs 按钮处于释放状态时,隐藏"我的博客 "侧边栏。 显示"我的博客"侧边栏的途径只有一个,就是通过 My Blogs 按钮,但隐藏它则有两个途径:通过 My Blogs 按钮或者位于它的右上角的 X 按钮。无论用户通过那种途径隐藏"我的博客"侧边栏,我们都必须保证 My Blogs 处于正确的状态。 首先,我们修改一下 ThisAddIn.cs 里的代码,去掉 ThisAddIn_Startup()方法里显示"我的博客"侧边栏的语句 (即把其 Visible 属性设为 true 那句):
如上图所示,你首先需要确保选择了 .NET Framework 3.5 的项目,接着选择 Visual C#\Office\2007\Word Add-in 作为项目模板(当然,你也可以选择 Visual Basic 下面的那个),然后依次输入解决方案名字和项目名字, 最后按下 OK 完成项目的创建。
探索 Word 2007 开发(一):我的博客
创建 Word 2007 插件项目 这里,我将会使用 Visual Studio 2008 Beta 2 所带的 VSTO(Visual Studio Tools for Office)来开发这个插件,
此外,Office 2007 也是必须的。
Figure 1
对于存盘草稿,我们可以使用 Documents.Open()方法来打开,并传递选定存盘草稿的 Path 属性的值:
需要说明的是,对于 Documents.Open()方法来说,除了第一个参数,其它参数都是可选的,但由于 C#不 支持这种可选参数,于是我们只好给它们传递 Type.Missing。
至此,"我的博客"侧边栏的开发要告一段落了,虽然我们还想让它变得更强大。作为一个 Word 2007 扩展 插件,现在的"我的博客"侧边栏存在一个不可忽视的问题:它是随 Word 2007 启动而启动,而不是因使用者的 需要启动,并且一旦关闭就无法再次启动,除非重新打开 Word 2007,这对于用户来说是无法接受的。下一回, 我们将探讨扩展 Word 2007 的 Ribbon,并尝试在它上面添加一个按钮来负责"我的博客"侧边栏的启动。
值得提醒的是,Blog.GetRecentPosts()方法所返回的数组的元素个数和对应博客的设置相关:
Figure 7
现在来看看运行效果:
Figure 8
查看博客、最近帖子和存档草稿 由于查看博客和查看最近帖子这两项操作都是"外包"给 Internet Explorer 的,我们可以简单地调用
System.Diagnostics.Process.Start()方法,并传入选定对象的 Url 属性的值:
对于 Code #04,以下几点是需要说明的: 我们使用 LINQ to XML 获取 Blogs.xml 中博客的相关资料,并把这些数据绑定到博客列表上。 我们获取 blogs 元素的 defaultBlog 属性的值,并用它来设置 cbxBlogs.SelectedText 属性,使得它所指定的默认 博客成为当前所选定的博客。 如果我们约定第一个 blog 元素就是默认博客,那么这里就不需要使用 defaultBlog 属性和设置 SelectedText 属性 了,因为当我们把一个数据源绑定到 DataSource 属性时,它会在完成绑定后把第一个条目设为当前选定项, 当然,此时会引发 SelectedValueChanged(和其它相关的)事件。 噢,别忘记 cbxBlogs 的 SelectedValueChanged 事件,下面是该事件的 Event Handler:
当然,别忘了引用 VSTO 的命名空间:
考验脑力区 using 关键词共有多少种用法?它们分别是什么? 现在来看看运行效果:
Figቤተ መጻሕፍቲ ባይዱre 5
到目前为止,"我的博客"侧边栏只是一个"空壳",接下来就是着手实现里面的逻辑了。
填充"我的博客"侧边栏 假设"我的博客"侧边栏的相关档安置在 My Blogs 文件夹里,该文件夹的结构如下图所示:
4. 当我们在最近帖子列表中选择某个帖子时,按下 View Post 按钮将会在 Internet Explorer 中打开该帖子 的网页;
5. 当我们在草稿列表中选择某个草稿时,按下 Open Draft 按钮将会在新的 Word 2007 中打开该草稿。 明确这些需求后,我们就可以着手写代码了:
Figure 2
设计 Blogging 标签
我希望在 Ribbon 里新增一个 Blogging 卷标放置相关的按钮,而不是和现有的按钮混在一起。要做到这样, 你需要对 Visual Studio 2008 Beta 2 为你创建的标签进行一些设置,把 ControlIdType 属性的值改为 Custom,然 后把 Label 属性设置为 Blogging:
打开 MyBlogsWordAddIn 项目并创建一个新的 Ribbon (Visual Designer):
Figure 1
完成 Ribbon (Visual Designer) 的创建后,Visual Studio 2008 Beta 2 会自动为你打开 Ribbon 的设计器,里面 为你创建了一个标签(TabAddIns)和一个功能组(group1):
Figure 3
接着,从工具箱中分别拖出一个 ToggleButton 和一个 Button,放在 Visual Studio 2008 Beta 2 为你创建的功 能组里,为这两个按钮分别选择你喜欢的图示(使用大小为 32x32 的 PNG 图示效果最佳),分别把它们的 Label 属性设置为 My Blogs 和 Manage Blogs,并把它们的 ControlSize 属性设置为 RibbonControlSizeLarge:
Figure 6
虽然我们可以通过枚举 My Blogs 的子文件夹来填充 cbxBlogs 控件,然而我希望设计一个类来表示博客并 且实现一定的资料绑定。回顾 Figure 4,"我的博客"侧边栏应该具备如下特性: 它会在启动时读取 My Blogs 文件夹里的相关信息,并且填充 cbxBlogs 控件;
Figure 4
接下来就是把 MyBlogsUserControl 嵌到 Word 2007 里了,要做到这样,最简单的办法就是在插件启动的时 候,以 Custom Task Pane 的方式加载控件。回到 ThisAddIn.cs,我们可以看到,Visual Studio 为我们准备好插件 的 Startup 事件的 Event Handler 了:
对于 Code #03,以下几点是需要说明的: Post、Draft 和 Blog 类都重写了 ToString()方法,这是因为 ComboBox 和 ListBox 等控件会调用该方法并把返 回的字符串用作条目的显示,重写该方法是为了让条目得到正确的显示。当然,如果你结合 DataSource 和 DisplayMember 来使用,也可以不重写 ToString()方法。 Blog.GetRecentPosts()方法里使用 Argotic Syndication Framework 来进行 RSS 信息处理,所以你需要下载 并安装它,然后在项目中引用相关的类库和 Argotic.Core.Rss 命名空间。 Blog.GetRecentPosts()方法里对 RSS 地址进行了假设,这个假设适用于博客园以及旗下其它网站,当然,你 可以想出很多方法让它具备普遍适用性。
这样,我们只需要在方法里面插入下面的代码:
作为应用程序级别(application-level)的扩展,Office 2007 引入了 Custom Task Pane 这个概念,然而,直 接通过 Office PIA 使用 Custom Task Pane 比较繁琐,于是,VSTO 提供了一个简化方案,正如 Code #02 所示的那 样。 增值服务区 Creating Custom Task Panes Using Visual Studio Tools for Office,Robert Green Creating Custom Task Panes in the 2007 Office System,Mark O'Hara and Frank Rice
Figure 2
我们的项目包含了一个名为 ThisAddIn.cs 的代码档,里面的 ThisAddIn 类就是我们的插件了。现在,我希 望为 Word 2007 创建一个像 Research 那样的侧边栏,里面将包含与我的博客相关的信息:
Figure 3
创建"我的博客"侧边栏 我不清楚以往怎样才能做到这样,但现在有了 VSTO,你可以把以往所学的 Windows Forms 的技巧都用上,
探索 Word 2007 开发(二):扩展 Ribbon
Ribbon 设计器
VSTO 2005 SE 以 RibbonX 的方式对 Office 2007 的 Ribbon 提供了支持,然而,这种支持不够直观,Visual Studio 2008 Beta 2 所带的 VSTO 则提供了可视化的设计器支持,本文将会探讨如何使用设计器扩展 Ribbon。
实际上,这样一个侧边栏就是一个用户控件(User Control)。现在,我们就来开发"我的博客"侧边栏。首先, 在项目里添加一个名为 MyBlogsUserControl 的用户控件,接着在它上面拖放下列控件:
cbxBlogs:用于显示博客列表 btnViewBlog:在 Internet Explorer 中打开选定博客的主页 lbxRecentPosts:列出选定博客最近发布的帖子 btnViewPost:在 Internet Explorer 中打开选定帖子的网页 lbxDrafts:列出存在本地没有发布的帖子草稿 btnOpenDraft:在 Word 2007 中打开选定的帖子草稿 MyBlogsUserControl 在 Visual Studio 中的设计如下图所示:
在 Blog.GetDrafts()方法里,我还假设 My Blogs 文件夹是放在"我的文档"里的,并且博客所在的文件夹名字 和博客的名字一样,当然,这样我们就不能在博客的名字里面包含非法的路径字符了。
我们可以让文件夹的名字和博客的名字相同,但却无法在这里包含博客的 URL 信息,而这又是很多操作 的前提,于是我在 My Blogs 文件夹里放置一个 Blogs.xml 档,里面包含了如下内容:
有了这个档,我们就可以顺利存取博客的 URL 信息了。另外,如果你希望让博客的名字不受路径的约束, 即可以包含非法的路径字符,那么你可以为 blog 元素扩展一个 directory 属性用于存放路径,这样 name 属性 就可以专门用于接口上的显示了。 增值服务区
你可以通过 Path. GetInvalidFileNameChars()或 Path. GetInvalidPathChars()方法查看非法的路径字符。 接下来就是把数据填充到"我的博客"侧边栏了,回到 MyBlogsUserControl.cs,在构造函数里添加如下所示 的代码:
Blog.GetRecentPosts()方法里使用 NetworkInterface. GetIsNetworkAvailable()方法判断当前网络是否连通,如 果连通则获取数据,否则返回空数组。
Blog.GetDrafts()方法没有进行任何筛选,这里假设文件夹里面只包含.docx 和/或.doc 文件。由于这些档将 会用 Word 2007 打开,如果你可能往文件夹里放置 Word 2007 不能读取的档,那么你最好为 LINQ 查询语句加 入 where 来进行必要的过滤。
2. 当我们在博客列表中选择某个博客时,它会读取该博客帖子草稿文件夹里的数据,并且填充 lbxDrafts 控件;
3. 当我们在博客列表中选择某个博客时,按下 View Blog 按钮将会在 Internet Explorer 中打开该博客的主 页;
Figure 4
完成了这些操作之后,你的 Visual Studio 2008 Beta 2 应该会是这样的:
Figure 5
现在,我们来看看运行效果:
Figure 6
打开/关闭"我的博客"侧边栏
My Blogs 按钮的实现主要有如下要求: Word 2007 启动的时候,"我的博客"侧边栏会被加载但不显示。 当 My Blogs 按钮处于按下状态时,显示"我的博客"侧边栏;当 My Blogs 按钮处于释放状态时,隐藏"我的博客 "侧边栏。 显示"我的博客"侧边栏的途径只有一个,就是通过 My Blogs 按钮,但隐藏它则有两个途径:通过 My Blogs 按钮或者位于它的右上角的 X 按钮。无论用户通过那种途径隐藏"我的博客"侧边栏,我们都必须保证 My Blogs 处于正确的状态。 首先,我们修改一下 ThisAddIn.cs 里的代码,去掉 ThisAddIn_Startup()方法里显示"我的博客"侧边栏的语句 (即把其 Visible 属性设为 true 那句):
如上图所示,你首先需要确保选择了 .NET Framework 3.5 的项目,接着选择 Visual C#\Office\2007\Word Add-in 作为项目模板(当然,你也可以选择 Visual Basic 下面的那个),然后依次输入解决方案名字和项目名字, 最后按下 OK 完成项目的创建。
探索 Word 2007 开发(一):我的博客
创建 Word 2007 插件项目 这里,我将会使用 Visual Studio 2008 Beta 2 所带的 VSTO(Visual Studio Tools for Office)来开发这个插件,
此外,Office 2007 也是必须的。
Figure 1
对于存盘草稿,我们可以使用 Documents.Open()方法来打开,并传递选定存盘草稿的 Path 属性的值:
需要说明的是,对于 Documents.Open()方法来说,除了第一个参数,其它参数都是可选的,但由于 C#不 支持这种可选参数,于是我们只好给它们传递 Type.Missing。
至此,"我的博客"侧边栏的开发要告一段落了,虽然我们还想让它变得更强大。作为一个 Word 2007 扩展 插件,现在的"我的博客"侧边栏存在一个不可忽视的问题:它是随 Word 2007 启动而启动,而不是因使用者的 需要启动,并且一旦关闭就无法再次启动,除非重新打开 Word 2007,这对于用户来说是无法接受的。下一回, 我们将探讨扩展 Word 2007 的 Ribbon,并尝试在它上面添加一个按钮来负责"我的博客"侧边栏的启动。
值得提醒的是,Blog.GetRecentPosts()方法所返回的数组的元素个数和对应博客的设置相关:
Figure 7
现在来看看运行效果:
Figure 8
查看博客、最近帖子和存档草稿 由于查看博客和查看最近帖子这两项操作都是"外包"给 Internet Explorer 的,我们可以简单地调用
System.Diagnostics.Process.Start()方法,并传入选定对象的 Url 属性的值:
对于 Code #04,以下几点是需要说明的: 我们使用 LINQ to XML 获取 Blogs.xml 中博客的相关资料,并把这些数据绑定到博客列表上。 我们获取 blogs 元素的 defaultBlog 属性的值,并用它来设置 cbxBlogs.SelectedText 属性,使得它所指定的默认 博客成为当前所选定的博客。 如果我们约定第一个 blog 元素就是默认博客,那么这里就不需要使用 defaultBlog 属性和设置 SelectedText 属性 了,因为当我们把一个数据源绑定到 DataSource 属性时,它会在完成绑定后把第一个条目设为当前选定项, 当然,此时会引发 SelectedValueChanged(和其它相关的)事件。 噢,别忘记 cbxBlogs 的 SelectedValueChanged 事件,下面是该事件的 Event Handler:
当然,别忘了引用 VSTO 的命名空间:
考验脑力区 using 关键词共有多少种用法?它们分别是什么? 现在来看看运行效果:
Figቤተ መጻሕፍቲ ባይዱre 5
到目前为止,"我的博客"侧边栏只是一个"空壳",接下来就是着手实现里面的逻辑了。
填充"我的博客"侧边栏 假设"我的博客"侧边栏的相关档安置在 My Blogs 文件夹里,该文件夹的结构如下图所示:
4. 当我们在最近帖子列表中选择某个帖子时,按下 View Post 按钮将会在 Internet Explorer 中打开该帖子 的网页;
5. 当我们在草稿列表中选择某个草稿时,按下 Open Draft 按钮将会在新的 Word 2007 中打开该草稿。 明确这些需求后,我们就可以着手写代码了:
Figure 2
设计 Blogging 标签
我希望在 Ribbon 里新增一个 Blogging 卷标放置相关的按钮,而不是和现有的按钮混在一起。要做到这样, 你需要对 Visual Studio 2008 Beta 2 为你创建的标签进行一些设置,把 ControlIdType 属性的值改为 Custom,然 后把 Label 属性设置为 Blogging:
打开 MyBlogsWordAddIn 项目并创建一个新的 Ribbon (Visual Designer):
Figure 1
完成 Ribbon (Visual Designer) 的创建后,Visual Studio 2008 Beta 2 会自动为你打开 Ribbon 的设计器,里面 为你创建了一个标签(TabAddIns)和一个功能组(group1):
Figure 3
接着,从工具箱中分别拖出一个 ToggleButton 和一个 Button,放在 Visual Studio 2008 Beta 2 为你创建的功 能组里,为这两个按钮分别选择你喜欢的图示(使用大小为 32x32 的 PNG 图示效果最佳),分别把它们的 Label 属性设置为 My Blogs 和 Manage Blogs,并把它们的 ControlSize 属性设置为 RibbonControlSizeLarge:
Figure 6
虽然我们可以通过枚举 My Blogs 的子文件夹来填充 cbxBlogs 控件,然而我希望设计一个类来表示博客并 且实现一定的资料绑定。回顾 Figure 4,"我的博客"侧边栏应该具备如下特性: 它会在启动时读取 My Blogs 文件夹里的相关信息,并且填充 cbxBlogs 控件;
Figure 4
接下来就是把 MyBlogsUserControl 嵌到 Word 2007 里了,要做到这样,最简单的办法就是在插件启动的时 候,以 Custom Task Pane 的方式加载控件。回到 ThisAddIn.cs,我们可以看到,Visual Studio 为我们准备好插件 的 Startup 事件的 Event Handler 了:
对于 Code #03,以下几点是需要说明的: Post、Draft 和 Blog 类都重写了 ToString()方法,这是因为 ComboBox 和 ListBox 等控件会调用该方法并把返 回的字符串用作条目的显示,重写该方法是为了让条目得到正确的显示。当然,如果你结合 DataSource 和 DisplayMember 来使用,也可以不重写 ToString()方法。 Blog.GetRecentPosts()方法里使用 Argotic Syndication Framework 来进行 RSS 信息处理,所以你需要下载 并安装它,然后在项目中引用相关的类库和 Argotic.Core.Rss 命名空间。 Blog.GetRecentPosts()方法里对 RSS 地址进行了假设,这个假设适用于博客园以及旗下其它网站,当然,你 可以想出很多方法让它具备普遍适用性。
这样,我们只需要在方法里面插入下面的代码:
作为应用程序级别(application-level)的扩展,Office 2007 引入了 Custom Task Pane 这个概念,然而,直 接通过 Office PIA 使用 Custom Task Pane 比较繁琐,于是,VSTO 提供了一个简化方案,正如 Code #02 所示的那 样。 增值服务区 Creating Custom Task Panes Using Visual Studio Tools for Office,Robert Green Creating Custom Task Panes in the 2007 Office System,Mark O'Hara and Frank Rice
Figure 2
我们的项目包含了一个名为 ThisAddIn.cs 的代码档,里面的 ThisAddIn 类就是我们的插件了。现在,我希 望为 Word 2007 创建一个像 Research 那样的侧边栏,里面将包含与我的博客相关的信息:
Figure 3
创建"我的博客"侧边栏 我不清楚以往怎样才能做到这样,但现在有了 VSTO,你可以把以往所学的 Windows Forms 的技巧都用上,
探索 Word 2007 开发(二):扩展 Ribbon
Ribbon 设计器
VSTO 2005 SE 以 RibbonX 的方式对 Office 2007 的 Ribbon 提供了支持,然而,这种支持不够直观,Visual Studio 2008 Beta 2 所带的 VSTO 则提供了可视化的设计器支持,本文将会探讨如何使用设计器扩展 Ribbon。
实际上,这样一个侧边栏就是一个用户控件(User Control)。现在,我们就来开发"我的博客"侧边栏。首先, 在项目里添加一个名为 MyBlogsUserControl 的用户控件,接着在它上面拖放下列控件:
cbxBlogs:用于显示博客列表 btnViewBlog:在 Internet Explorer 中打开选定博客的主页 lbxRecentPosts:列出选定博客最近发布的帖子 btnViewPost:在 Internet Explorer 中打开选定帖子的网页 lbxDrafts:列出存在本地没有发布的帖子草稿 btnOpenDraft:在 Word 2007 中打开选定的帖子草稿 MyBlogsUserControl 在 Visual Studio 中的设计如下图所示:
在 Blog.GetDrafts()方法里,我还假设 My Blogs 文件夹是放在"我的文档"里的,并且博客所在的文件夹名字 和博客的名字一样,当然,这样我们就不能在博客的名字里面包含非法的路径字符了。
我们可以让文件夹的名字和博客的名字相同,但却无法在这里包含博客的 URL 信息,而这又是很多操作 的前提,于是我在 My Blogs 文件夹里放置一个 Blogs.xml 档,里面包含了如下内容:
有了这个档,我们就可以顺利存取博客的 URL 信息了。另外,如果你希望让博客的名字不受路径的约束, 即可以包含非法的路径字符,那么你可以为 blog 元素扩展一个 directory 属性用于存放路径,这样 name 属性 就可以专门用于接口上的显示了。 增值服务区
你可以通过 Path. GetInvalidFileNameChars()或 Path. GetInvalidPathChars()方法查看非法的路径字符。 接下来就是把数据填充到"我的博客"侧边栏了,回到 MyBlogsUserControl.cs,在构造函数里添加如下所示 的代码:
Blog.GetRecentPosts()方法里使用 NetworkInterface. GetIsNetworkAvailable()方法判断当前网络是否连通,如 果连通则获取数据,否则返回空数组。
Blog.GetDrafts()方法没有进行任何筛选,这里假设文件夹里面只包含.docx 和/或.doc 文件。由于这些档将 会用 Word 2007 打开,如果你可能往文件夹里放置 Word 2007 不能读取的档,那么你最好为 LINQ 查询语句加 入 where 来进行必要的过滤。