我们的All-In-One Code Framework项目里面的Sample工程已经增长到了300多个,于是就有了一个新问题:我是一个.NET开发者,我现在想知道怎么用VB.NET或者C#自动化操作Office,面对茫茫300多个文件夹,我迷茫了……
为了解决这个问题,我制作了一个小工具可以帮助大家快速地从300多个(还在不断增长中)工程中快速搜索到自己需要的Sample:All-In-One Code Framework Sample Browser。

现在,你只需要在这个Sample Browser里面输入关键字(如上图所示的“office”和“automation”),所有和这些关键字匹配的工程就会被列出来(你还可以进一步用开发语言过滤结果);选择列表中的某个项目,就可以看到这个项目的说明(界面下方黑底白字部分);双击项目图标,就会直接在Visual Studio中打开该项目。方便多了吧?
关于如何获得、安装(其实只是复制两个文件)这个工具,请参考:微软All-In-One Code Framework 代码示例浏览器 v1 beta版。哦,这篇Blog里面有一个错误:其实我WPF一点都不牛的。
这次 All-In-One Code Framework 新增了14个示例工程:
- 使用C#扩展LINQ的功能
- 使用C#开发Office Shared Add-in(非VSTO)
- 使用C++开发托管Office Add-in(非VSTO)的包装程序,从而实现各个托管Add-in在应用程序域级别的隔离
- 使用VSTO 2008 SP1的新特性获取Office对象的VSTO包装
- 使用C#自动化PowerPoint
- 使用VB.NET自动化PowerPoint
- 使用VC++自动化PowerPoint
- 在WinForm中使用DataGridView
- 在VC++应用程序中实现UAC Elevation(Windows Vista及后续版本的安全机制)
- 使用C#配置Windows防火墙
- 使用VC++ Subclass窗口
- 在C#应用程序中使用CodeDOM实现源代码动态生成、编译、运行
- C++的同步I/O操作
- C++的异步I/O操作
感兴趣的同学们可以赶紧去下载了!
All-In-One Code Framework项目4月11日发布了一个新的版本。在这个版本中,我们新增了COM+、LINQ、VSTO、.NET Reflection、MFC、Win32、C++相关的一些工程示例。要了解所有新增的示例详情,请参阅这篇Blog或者直接到All-In-One Code Framework网站下载源代码。
在这个版本中,VSTO相关内容是我增加的CSVstoExcelWorkbook项目。这个项目演示了一些基本的Excel文档级扩展功能:
- 如何连接到数据源(SQL Server、Oracle、Access等)
参考文档:如何:创建与 SQL Server 数据库的连接、如何:创建与 Oracle 数据库的连接、如何:创建与 Access 数据库的连接
- 如何把数据绑定到Excel工作表中
参考文档:如何:用数据库中的数据填充工作表

- 如何在“文档操作”任务窗格里面添加自定义控件。在我的示例中,用户可以通过“文档操作”选择数据查询的条件,并且把相应结果返回并显示在工作表中。
参考文档:如何:向 Excel 工作簿添加操作窗格、操作窗格概述

最终用户打开文档之后,就可以通过我们添加的自定义元素快速获取需要的数据了:

上个星期我的一篇博客提到了All-In-One Code Framework:一站式微软开发技术框架解决方案,之后看到有不少微软技术的爱好者开始从CodePlex上下载这个项目的源代码。我们也很受鼓舞。
本周的更新增加了下列内容:
数据访问:
- 在C#中使用ADO访问数据
- 在C#中使用ADO.NET访问数据
Office开发:
IPC和RPC:
- 使用C#制作一个named pipe服务端
- 使用C#制作一个named pipe客户端
- 使用C++创建shared memory
- 使用C++访问shared memory
- 使用VB或者C#制作一个.NET Remoting服务端
- 使用VB或者C#制作一个.NET Remoting客户端
本周我们还在继续努力制作新的样板,并且会着手让工程文件更加容易访问。如果你有任何的建议,可以在这里发布,随便用中文还是英文都行(要不,咱还是说母语吧?)。
如果要你说说有哪些和开发相关的微软技术,不许打草稿,马上说!你能想到啥?MFC?COM?ActiveX?ATL?Win32?.NET?C++?C#?VB?VSTO?ASP?!@&*^#*(&!^ 脑袋里一团糟?
如果老板说“我们需要一个ActiveX控件,哎那谁谁,你不是会ATL嘛,赶紧做一个吧,周末交货!”,而其实你最近一次用ATL做ActiveX控件是在大学三年级的时候……八年啦!忘光啦!怎么办?
如果你想学一个微软的开发技术,却又苦于找不到简明易懂的示范工程,怎么办?
请看广告!
我团队里的一位同事在CodePlex上面创建了一个项目,叫做“All-In-One Code Framework”。这就是你所需要的东西!
All-In-One Code Framework包含了(或即将包含)几乎所有常见的微软开发技术的项目框架,并且每个样板工程都有详细的文档说明。如果你需要快速创建一个某种技术的工程,参考里面的样板是再方便不过的了。对于某些技术,我们还提供了多种语言/框架的实现。比如创建一个ActiveX控件,我们提供的框架里面有ATL、MFC、VB、C#的等同实现。如果你精通ATL开发ActiveX,现在想学用C#开发,只要对比参照两个项目,很快就能摸出门道了。
乍一看All-In-One Code Framework似乎是为了某些技术的初学者准备的,其实不然。即便是经验丰富的工程师,如果在日常工作中需要快速创建一个工程对某个技术难点进行调试,有一份All-In-One Code Framework的样板在手就可以节约很多重复劳动的时间。
如果你开始觉得有兴趣了,可以到CodePlex上下载源代码。我们也很希望听到大家的反馈,有了反馈我们才能进一步完善它。
时间过得特别快,一眨眼2009年都已经进入第三个月了。自从上次更新以来发生了很多事,公事、私事接踵而来。在这里当然只谈公事,私事是在Live Space上谈的。
第一件大事就是“俺换工作啦!”从2006年中到2008年底,我在微软VSTO团队干了两年半的SDE/T(v-),也算是机缘巧合,将近年底的时候得到一个面试机会,最后加入了MSDN在线支持团队。
由第一件大事引发的第二件“小事”,那就是我在这里的博客内容也会发生变化了。原来只专注于写VSTO技术,现在范围可得扩大很多。本来今天还打算把博客标题修改一下的,却发现新版本的管理功能内赫然写着“coming soon...”。
今后打算在这里写一些我日常工作中“助人为乐”的时候得到的经验和启发,内容会比较零散,帮到哪儿写到哪儿吧。
曾经在一个 VSTO 2008 的讨论会上听到一些小型软件开发商的担忧:我们本来使用 C++ 为 Office 开发插件,然后通过互联网给用户下载,并且收取费用。现在我们想用 VSTO,但是发布插件的时候,居然要用户下载 200MB 的 .NET Framework???我的插件本身才 50K 哎!我的很多用户现在依然使用低速网络接入,200MB 的内容够他们下载整整一天的了,这样我的产品怎么卖得出去?
发布,很现实的问题,开发人员使用 VSTO 强大的功能,可以快速做出以前很难实现的功能,可是如果最后却很难把产品分发给用户,那前面的工作又有什么意义呢?在企业内部,我们可以通过“推送”的方法把 .NET Framework 方便地部署到每个客户端 PC,接下来再部署基于 VSTO 的解决方案就不是那么困难了;但是对于 ISV 呢,难道他们就注定和 VSTO 无缘了?
也许不是。
在先前的 Blog 里面我们提到过随着 Visual Studio 2008 SP1 的发布,VSTO 现在可以把“.NET 框架客户端配置(.NET Framework Client Profile)”作为目标框架。在这种配置下,如果目标系统没有安装 .NET Framework,那么安装程序将下载一个面向客户端应用程序的 .NET Framework 3.5 SP1 的子集。下载量将从原来的 200MB 缩小到 26.5MB。
那么如何使 VSTO 的解决方案使用针对客户端的配置呢?
- 创建一个新的 VSTO 加载项工程(针对 Office 2007)
- 打开工程属性页面
- 在“应用程序”选项卡的“目标框架”选项中,钩选“客户端配置文件子集”

- 保存工程
作了上述的修改之后,工程中所有对 .NET 框架类库的引用,都必须限制在“客户端配置文件”这个子集内,编译器会负责这项检查,并且指出超出范围的引用。关于“客户端配置文件”的详细信息,可以参阅这篇 MSDN 文档:.NET Framework 客户端配置文件。
在准备发布工程的时候,我们还需要在“工程属性”的“发布”页面里面对预安装选项进行调整:原先需要预安装完整版本的 .NET Framework 3.5 SP1 可以改为预安装 .NET Framework Client Profile。

这个问题在中文、英文 MSDN 的 Office 开发论坛上都看到过(也正好都是我提供了答案),看来也算是一个“国际化需求”了。今天就记录一下和大家分享。
故事是这样的:开发人员有一个 WinForm 应用程序,它从数据库里面读取出一条记录后,获得了一个记录 ID,然后需要打开 Word 或者 Excel,用已经准备好了的 VSTO 文档或者是插件,根据这个记录 ID 生成相应的 Office 文档内容。问题是,怎么把这个 ID 传给 Word 或者 Excel?
有一个很简单的实现方法——直接在启动 Word / Excel 的命令行里面加参数!比如:
<Excel.exe> /r "D:\ExcelWorkbook1.xlsx" /e /id:1234
其中 <Excel.exe> 应该是 Excel.exe 的完整路径。
/r 后面跟 VSTO Excel 文档的完整路径。
/e 告诉 Excel 不要打开一个空白新文档。
/id:1234 就是自己定义的参数了,你可以在这里把你的ID号传入。当然参数名字也可以是其它的,并不是一定要“id”。
第二步,在 VSTO Excel 文档里面,可以通过下面的代码枚举命令行参数:
For Each a As String In Environment.GetCommandLineArgs
MsgBox(a)
Next
上面的代码如果被执行,会把所有命令行参数都显示出来。
只要找到其中/id:开头的参数,把数字取出来就好了。
对于 Word,也可以用类似的方法,只是 /r /e 之类的参数要换成对应的 Word 参数。
这个方法用在 Word 2007 / Excel 2007 没有问题,但是我不能保证将来的版本是否也可以这样用。特别是如果你添加的自定义参数不巧被新版本用作标准参数名的话……所以参数名最好独特一点啦。
上次在 TechEd 的时候就有很多朋友抱怨中文的 VSTO 书籍太少(还是没有?)。那我今天就要大声吆喝一下:咱 VSTO 也有官方中文参考书籍啦!!!——虽然不是我写的,也不是我翻译的,但是只要是 VSTO 相关的,我就要吆喝……
这本书的原作者现在分别是 Visual Studio 商业应用组(VSTO、VSTA、SharePoint 开发、数据访问工具、中小商业应用开发等)的首席开发经理 Eric Carter;Visual Studio 程序语言组(C#、VB.NET)的大佬 Eric Lippert……绝对的重量级人物。
这本书非常适合各类 VSTO 初学者仔细阅读,因为内容由浅入深,也一定程度上照顾了具有 Office VBA 开发经验、现在想迁移到 VSTO 平台的朋友们;也适合已经有一定经验的 VSTO 开发者在手边放一本以便随时查阅,因为书中的内容基本上很全面地覆盖了 VSTO 2005 的所有知识点,如果在开发过程中突然脑袋卡壳儿想不起来啥,翻翻书就能找到答案。
既然号称是“第一本”,自然也有很多不足之处。比如有些地方翻译得实在不怎么地,而介绍的产品也不是最新的版本。不过瑕不掩瑜,如果您面对全英文技术书籍感到头痛,那么这本书还是个不错的选择。
博文视点出的,我觉得稍微有点贵,定价¥99。游说能力强的弟兄们可以说服老板掏钱买一本加入公司的技术图书库里面,哈哈,别说是我的主意哦!
下面的图片:第一张是中文版封面,我也是今天刚看到,新鲜出炉的。另一张是我“左青龙右白虎”,分别托着原版和中文版,当时心中的体会“知识就是重量”,这两本书可真是重啊!!!

之前的一篇 Blog 提到了关于在不同的 Culture 环境中对字符串的转换和比较需要注意的地方,这又让我想到了前一阵子在英文 MSDN 论坛 VSTO 板块上为一个用户解决的问题:
用 VSTO 开发一个 Outlook 的加载项,在 Outlook (以及这个加载项)运行的过程中,如果用户修改了“控制面板——区域设置”中的 Culture 信息,比如日期的显示格式;怎样在不重新启动 Outlook 或这个加载项的前提下马上反映出用户所做的修改?
我们的第一反应就是“在格式化数据(日期或者数字等等)的时候,用 CurrentCulture 就可以了”。可事实上这还不够。因为 CultureInfo 的相关信息在第一次被调用之后,就缓存起来了,直到它所在的 AppDomain 生命周期结束。如果系统的区域设置发生变化,CultureInfo 是不会自动反映出来的。我们需要用 CultureInfo.ClearCachedData 方法手工更新这些信息。
为了知道系统的区域设置发生了变化,我们可以通过注册 SystemEvents.UserPreferenceChanged 事件来获得通知。
另外值得注意的是,在加载项卸载之前,我们必须要注销事件通知,否则可能会发生内存泄漏。
完整示例代码:
Imports System.Globalization
Imports Microsoft.Win32
Public Class ThisAddIn
Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
AddHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged
End Sub
Private Sub SystemEvents_UserPreferenceChanged(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs)
If (e.Category = UserPreferenceCategory.Locale) Then ' 发生变化的项目:区域设置
CultureInfo.CurrentCulture.ClearCachedData()
End If
End Sub
Private Sub ThisAddIn_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown
RemoveHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged
End Sub
End Class
原以为土耳其“I”的问题已经是老生常谈,但事实证明大家都知道未必就是大家都能做到。今天在一段代码里面又一次发现了这个错误。
很简单,下面的代码:
string msg = "Info";
if (msg.ToLower() == "info")
{
....
}
看起来没有什么问题,if 里面的代码应该会被执行吧?但是在土耳其语的系统中,故事就不同了。如果当前线程默认 Culture 是土耳其语,那么不带任何参数的 ToLower 会按照土耳其语的规则转换字符“I”。
在土耳其语中,字母“i”的对应大写是“İ”,而字母“ı”的对应大写才是“I”。
所以,上面的代码将会得到“不等”的结果。要避免默认 Culture 对文化无关的字符串转换、比较造成干扰,我们要使用 CultureInfo.InvariantCulture,或者用诸如 ToLowerInvariant() 之类的方法。 否则一个不小心,可能会给将来的调试、维护带来很多意外的麻烦。
在 MSDN 论坛上看到这样一个问题(原贴地址):
“我在用 VSTO 2008 写一个 Outlook 2007 的插件。这个插件有一个窗体区域(Form Region)显示在‘约会’(Appointment)窗体中,我怎样才能捕捉‘约会’对象的‘保存’事件,以便在保存约会的时候执行一些我自己的代码?”
我提供了一个解决方案(其他类型的 Outlook 对象也有很类似的实现方法):
- 在用户区域装载的时候(FormRegionShowing 事件),把 OutlookItem 属性所引用的对象转换成 Outlook.Appointment 类型。
- 为 Appointment 注册 Write 事件的代码。
- 在 Write 事件处理方法中添加自定义代码实现业务逻辑要求。
当一个约会项目被显式(比如调用了 Save 方法或者按“保存”按钮)或者非显式(比如在关闭这个项目的窗口的时候作了答复操作)保存的时候,Write 事件就会被触发。这时候还可以通过设置 Cancel 参数来取消保存操作。
下面的代码片断展示了如何在 Form Region 里面注册 Write 事件。为了代码清晰,一切从简:
'Occurs before the form region is displayed.
'Use Me.OutlookItem to get a reference to the current Outlook item.
'Use Me.OutlookFormRegion to get a reference to the form region.
Private Sub MyFormRegion_FormRegionShowing(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MyBase.FormRegionShowing
If TypeOf Me.OutlookItem Is Outlook.AppointmentItem Then
AddHandler CType(Me.OutlookItem, Outlook.AppointmentItem).Write, _
AddressOf Item_Save
End If
End Sub
Private Sub Item_Save(ByRef Cancel As Boolean)
MsgBox("This appointment is to be saved!", vbOKOnly Or vbInformation)
End Sub
VSTO Power Tools 1.0 发布啦!
下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=46B6BF86-E35D-4870-B214-4D7B72B02BF9&displaylang=en
总共九个小工具、扩展类库,被包含在三个安装文件内(因为授权类型有不同的三种,所以需要三个安装包)。其中的“VSTO Troubleshooter”、“Open XML Package Editor”和“Office Custom UI Manager”都有我们上海的 VSTO 团队参加了开发、测试。
VSTO Troubleshooter 是一个非常实用的工具,它可以分析当前系统的配置,并给出一个报告,指出当前环境如果需要运行 VSTO 开发的解决方案还缺少一些什么东西,或者是“万事俱备只欠东风”。如果客户在安装了你辛辛苦苦开发出来的 Office 加载项、VSTO 文档,却告诉你“出错了不能运行”,那么这个工具就是帮助你快速诊断原因的好帮手。
Open XML Package Editor 是一个图形界面的编辑器,可以直接打开 Open XML 格式的 Word、Excel、PowerPoint 文档察看、修改里面的内容。
Office Custom UI Manager 是一个开源的类库,通过这个库,开发人员可以更方便地管理 Office 界面上的常见控件元素:Ribbon、Custom Task Pane、Window、Explorer (Outlook)、Inspector (Outlook),和它们之间的从属关系。
这套工具都需要环境中安装了 Visual Studio Tools for Office 2008 和 2007 Office System。
如果你是使用 VSTO 的 Office 平台开发者,嫑犹豫了,赶快去下载吧!
前言:TechEd 2008 回来之后,就一直计划着写一些关于 VSTO 2008 的东西。在 TechEd,我接触了一些希望使用 VSTO 做 Office 平台开发的业界同仁,发现很多朋友对 VSTO 还不是那么了解,所以在这次的《探索 VSTO 2008》系列里面,我会从最简单的内容写起。第一篇就是关于开发环境的设置和熟悉。后续的会有各种控件、组件、对象的使用,数据绑定,发布,安全性等各方面的专题。我希望每一篇都保持简短,保证大家有耐心看完然后快速上手实验。如果有写得不详细的地方,可以留言给我,保证有问必答。
Visual Studio 2008 宣布 RTM 也有那么几天了,相信不少微软技术发烧友早就迫不及待地从 MSDN Subscription 网站下载了火热出炉的光盘镜像。如果您没有 MSDN Subscription 也没关系,您可以到下列地址下载 90 天试用版本:http://msdn2.microsoft.com/en-us/vstudio/products/aa700831.aspx。注意,要使用 Visual Studio 2008 做 Office 平台开发,您必须安装 Visual Studio 2008 Professional 或者更高的 SKU,VSTO 目前还没有可以免费使用的 Express 版本(不过说不定哪天就有了哦)。
接下来我们看看怎么构建一个学习 VSTO 的实验环境。
首先如果条件允许,可以安装一个干净的系统。如果内存、硬盘空间足够,可以用虚拟机,至少分配 512MB 内存。操作系统可以用 Windows XP / Windows Vista 或者 Windows Server 2003。操作系统搞定之后,我推荐的安装顺序是:先安装 .NET Framework 2.0(如果是 Windows Vista 则跳过此步),接着用 Windows Update 把所有系统更新装好,然后再安装 2007 Office 系统套件,要确保安装其中的 .NET 编程支持。最后安装 Visual Studio 2008,确保 VSTO 安装组件。所有这些准备工作如果顺利的话,大约一个上午就可以完成。
 |
 |
|
确保.NET 编程支持的安装 |
确保VSTO组件的安装 |
好了,迫不及待打开 Visual Studio 2008 的界面,创建新工程。VSTO 2008 项目模板在“新建工程”的对话框中有三种地方可以找到:
- C# 或者 Visual Basic 语言节点,可以找到最常用的 Word、Excel、Outlook 模板
- Office 节点,可以找到所有的 VSTO 模板,其中的 2003、2007 节点则根据 Office 版本进行了区分
- Workflow 节点,可以找到 SharePoint 2007 工作流模板
 |
 |
|
语言节点的常用VSTO模板 |
工作流节点的SharePoint模板 |
由于 Visual Studio 2008 兼容基于 .NET 2.0 至 3.5 的开发,所以在“新建工程”的对话框中我们可以看到有一个选择 .NET Framework 版本的下拉列表。这个列表对 VSTO 的影响在于对 Office 版本的支持上。如果我们需要开发支持 2007 Office 系统的项目,就必须选择 3.5 版本的 .NET Framework,因为这些模板用到了很多新版本框架的特性。如果只是开发支持 2003 Office 系统的项目,那么选择 2.0 版本的 .NET Framework 也可以。
 |
 |
|
.NET Framework 3.5 支持所有 VSTO 工程类型 |
.NET Framework 2.0 只支持 Office 2003 的 VSTO 工程 |
选择一个 Word 2007 Document 的工程模板,第一次创建某个 Office 应用程序的工程,可能会出现一个信息框,要求启用 VBA 访问,这个时候必须选择确定,否则就不能继续了。这个选项也可以手工在 Office 应用程序的“信任中心”控制。
|
|
允许 VBA 访问 |
完成创建工程向导之后,我们就看到了熟悉的开发界面。和 WinForm 应用程序开发不同的是,设计器里面是个实实在在的 Word 环境。在工具栏里面,除了标准的 Windows Forms 控件、组件,我们还可以看到 VSTO 为 Word 而定制的控件——Content Control(内容控件)。在后面的专题中,我会专门用一集的时间介绍这些内容控件的功能和使用方法。
在结束之前,我们再一起看看一个典型的 Word 文档工程用到了哪些程序集——要知其所以然。打开项目属性页面,点击“引用”选项卡。图中用记号笔划出来的那些程序集就是一个典型 VSTO Word 文档项目所必须的程序集。对这个有所了解在今后开发当中解决问题可能有所帮助。
|
|
一个典型Word文档工程的程序集引用 |
好了,今天的开篇就到这里了。大家在动手实验的过程中有什么问题,或者希望我接下来写 VSTO 哪方面的东西,请一定要留言告诉我!