早就知道了有这么一个服务,但一直没有机会尝试,今天趁有空,将一个Office Business Applications的Casestudy录像上传到了Silverlight Streaming服务,效果还不错。:)
Tips:双击可转为全屏播放模式。
最近,我们Team正在制作一个3天的OBA开发系列课程Video。也就是,我们将这三天的课程,包括每个课程对应的动手试验,都在自己的电脑上真实的讲演一次,同时用录屏软件将屏幕和声音实时录制下来。由于是专门进行屏幕和声音的录制,所以录制效果会比较好。
最终这个OBA Learning Series会包括:
中文PPT
课程Video
中文动手实验手册
动手实验Video(也就是按照动手实验手册上的内容,将从头到尾做一遍的过程录制下来)
课程中用到的所有Demo源代码
专题 1 – 了解 Office Business Application业务应用程序
专题 2 – 将业务数据整合到具有 Open XML 文件格式的 Office 文档
实验 – 将业务数据整合到具有 Open XML 文件格式的 Office 文档
专题 3 – 将业务数据整合到具有 Fluent UI 扩展性的 Office 文档(第一部分)
专题 3 – 将业务数据整合到具有 Fluent UI 扩展性的 Office 文档(第二部分)
实验 – 将业务数据整合到具有 Fluent UI 扩展性的 Office 文档
专题 4 – SharePoint 网站和安全框架
实验 – SharePoint 网站和安全框架
专题 5 - SharePoint 存储引擎(第一部分)
专题 5 - SharePoint 存储引擎(第二部分)
实验 - SharePoint 存储引擎
专题 6 – 定义业务流程和工作流
实验 – 定义业务流程和工作流
专题 7 – 构建、打包和部署 SharePoint 的组合用户界面
实验 – 构建、打包和部署 SharePoint 的组合用户界面
专题 8 – 整合业务实体与业务数据目录
实验 – 整合业务实体与业务数据目录
专题 9 – 企业搜索
实验 – 企业搜索
专题 10 – 利用 Excel 服务和报表中心创建报表、分析表和信息板
实验 – 利用 Excel 服务和报表中心创建报表、分析表和信息板
我们希望在5月份上旬就制作完成。具体发布方式可能会是由市场部门制作成DVD光盘,但我会尽量将完整内容直接发布到我的blog上。
试看视频:实验 - 定义业务流程和工作流
总所周知,在Microsoft Office 2007中,微软引入了一种全新的文档格式:Open XML。由于Open XML是一种开放的文档格式(基于两种开放技术:XML、Zip),所以解决了过去Microsoft Office所使用的二进制文档难以交互、难以被第三方应用程序访问的问题。
但是自从微软决定将Open XML提交给ISO之后,从业界的反馈来看,很多人仍然非常关心过去的二进制文档格式(.doc, .xls, .ppt),并希望能得到其相关的技术细节文档。
经过慎重的考虑,微软决定再将Microsoft Office所使用的二进制文档格式公开。任何人和企业,在不违反相关协议的前提下,都可以免费得到其技术规范文件。现在,无论是全新的Open XML格式文档,还是过去的二进制格式文档,都不会再有人,或者企业,抱怨微软“藏着掖着”了吧。:)
如何获取二进制文档格式规范,请参看此篇KB中的“Royalty-Free File Format Programs”一节。
随着Office 2007与SharePoint Server 2007的正式发布,开发合作部的同事真是活跃啊,TechReady MOSS2007培训现在正在进行当中,微软新技术开发培训Workshop又开场了,这个Workshop里面的Office部分包含了一天的Office 2007 Clients开发和一天的SharePoint Server 2007开发课程。而且,这次Workshop选择在了苏州、青岛、武汉三个地方进行,真是大大造福了三地的Office开发人员啊!
9月份,TechED 2006将在北京、上海、广州三地进行,具体的日程和地点可以浏览TechED 2006网站。
在TechED 2006上将进行的Office 2007和SharePoint Server 2007的课程包括:
零编程构建基于SharePoint Server 2007的解决方案(BJ/SH/GZ)
Microsoft Office SharePoint Server 2007 Web Parts开发(BJ/SH)
使用WinWF构建Microsoft Office SharePoint Server 2007中的工作流应用(BJ/SH/GZ)
InfoPath2007新特性及工作流解决方案(BJ/SH/GZ)
在MOSS2007中使用Business Data Catalog 进行企业数据集成(BJ)
用Microsoft Office SharePoint Server 2007治疗你的SharePoint头痛症(BJ/SH/GZ)
应用SharePoint Server 2007实现企业搜索(BJ/SH)
Office 2007 Open XML File Format 应用与开发接口(BJ)
The 2007 Microsoft Office System 尝鲜(BJ/SH/GZ)
利用 2007 Microsoft Office system 提升企业商业洞察力(BJ)
Working with Content Types, Field Types, and Other Facilitiesfor SharePoint Lists and Libraries(BJ)
Using Site Definitions and Features for ConstructingCustom SharePoint Sites(BJ)
项目管理成功之道 Project 2007(BJ/SH/GZ)
Project Portfolio Server 2007 提供决策依据(BJ)
(以上课程列表仅供参考,以后可能进行更改,正式的名单请参考TechEd 2006网站)
另外,在TechED 2006的有关Office、SharePoint的课程中,奖品将包括:《SharePoint Portal Server 2003 深入指南》、《Microsoft Office SharePoint Server 2007 前瞻技术指南》、Microsoft Office SharePoint Server 2007 Beta2 Technical Resource DVD等。
现在,TechED 2006正在美国波士顿热热闹闹的举行着。今年,微软中国的IW(Information Worker)部门全程赞助了两位OTEC优秀成员去波士顿现场参加TechED 2006,其中包括我的老朋友
陈曦。希望他能在
他的blog上不断的把最新的现场见闻发上去。如果你想最快的了解TechED 2006的一些消息,也可以浏览
Virtual TechED 2006网站。
Windows SharePoint Services v3 Beta2 IT Pro Documents下载,是了解WSS v3的好东东。
2007 Office System: How Do I ScreenCasts下载,包含了一些SharePoint 2007和Office 2007的开发视频讲座。
如果你需要为Outlook开发插件,并且想了解Outlook 2007的对象模型有何不同,可以下载一个
Outlook 2007插件示范程序。你需要有VS2005和Outlook2007来运行这个示范程序。对了VSTO的下个版本(VSTO "Orcas"),你也看看
这个视频。
为了能让Office XP和Office 2003能够读取最新的Office 2007格式的文档,微软已经承诺要为Office XP和Office 2003发布专门的更新包。现在,你就可以在
这里下载到Office XP和Office 2003的Office 2007 Beta2文档格式兼容包。当然,这并不是最终的版本,而仅仅针对Office 2007 Beta2。实际上,如果你已经在自己的机器上安装了Office 2007 Beta2,对于重要的文档,我强烈推荐你仍然将其保存为Office 2003的兼容格式,因为微软并不承诺在未来的Office 2007更新版本中不再更改Office 2007文档格式了。
Office 2007 Beta2允许用户将其与系统中已存在的Office 2003进行Side-by-Side方式的安装,安装完成后,用户可以在机器上同时使用Office 2003与Office 2007 Beta2。但是,有一个例外,那就是Outlook。
这是因为Outlook 2007 Beta2会升级系统中的MAPI组件,而这样会导致Outlook 2003无法工作。即使用户卸载Outlook 2007 Beta2以后,仍然会发现Outlook 2003无法启动,它会提示说MAPI32.DLL版本不正确或者文件被损坏。
解决这个问题的方法非常简单,就是使用Windows自带的搜索功能,搜索硬盘上所有的“MAPI32.DLL”和“MSMAPI32.DLL”文件,然后将它们随便改一个名字,然后再启动Outlook 2003。Outlook 2003启动时会发现找不到这个文件了,然后就会自动重新安装这个文件。
如果对Office 2007 Beta2非常感兴趣,现在您就可以通过微软的Office 2007网站下载到所有的Office 2007 Beta2组件,包括SharePoint Server 2007!点击
此处。
想使用Word来写blog吗?呵呵,Word 2007中内置了对blog发布的支持。只需要使用“Publish - Blog”菜单,就可以轻松的将Word文本发布到你的blog上。

从上图可以看到,现在Word 2007 Beta2支持多个blog服务提供商(包括MSN Space)、使用SharePoint 2007搭建的blog、以及基于Community Server搭建的blog。好像博客堂没有使用最新的Community Server,所以就没法在博客堂试了。:)
Office Developers Conference是微软公司专门针对Office开发人员的盛会,今年的ODC大会正在美国紧锣密鼓的进行着。可以预见,今年的ODC上肯定都是SharePoint 2007、Office 2007的讲座,呵呵,想想都让人向往啊。
幸好OTEC成员王瑜同志现在就在ODC 06会场,他同时也正在OTEC论坛上连载每日的ODC见闻。
报导一 报导二
Office Developer’s Conference 2006正在美国热热闹闹的举行着,大会上首先放出来的好东东,就是Visual Studio Tools for Office v3,下一代Office 2007开发平台的第一个CTP测试版。
VSTO v3针对的版本是Office 2007 Beta1 Technical Refresh,同时需要Visual Studio 2005 Team System版本(或者单独的VSTO 2005版本)和WinFX Feb06 CTP的支持。
相比VSTO2005,VSTO v3的主要改进有:
1、应用程序级的插件开发支持
VSTO2005仅仅包含了Outlook 2003 Add-in的开发支持,如果想开发Office其他组件的插件,就只能使用Visual Studio 2005中带的共享Add-in项目类型。VSTO v3将内置全部Office 2007组件(Access、Excel、SharePoint Designer、InfoPath、Outlook、PowerPoint、Project、Publisher、Visio、Word)的插件开发支持。

2、应用程序级的任务窗格
VSTO2005支持文档级别的任务窗格,但是不支持应用程序级的,也就是说,VSTO2005只能开发针对某一个文档的任务窗格,而不能开发在一个应用程序(比如Word或Excel)中总是存在的任务窗格。VSTO v3终于能够支持应用程序级的任务窗格了!

3、定制Ribbon
啥是Ribbon?如果你见过Office 2007新界面,那么一定对上方那一排类似Tab的操作窗格印象深刻,它们就是Ribbon。通过VSTO v3,我们可以定制出自己的Ribbon。

4、支持新的Open XML文档格式
Office 2007中的Word、Excel、PowerPoint文档都使用了一种新的完全基于XML的文档格式,正式名称是Open XML File Format。并且,对于这种新的文档格式,Office 2007也使用了新的文件扩展名来与之前版本的基于二进制的文档格式进行区别。Word 2007新文档扩展名是docx,Excel 2007新文档扩展名是xlsx等等…
VSTO v3充分利用了这种新的文档格式。比如,它将Data Island中的数据就以单独的XML Part的方式保存在文档中,而不再像VSTO2005一样,使用一个OLE控件来保存Data Island中的数据。
点击
这里下载VSTO v3 CTP。
|
广州 OTEC Meeting Agenda |
|
Time |
Session |
Abstract |
Speaker |
|
9:30--10:00 |
Chick-in |
|
10:00--10:50 |
SharePoint在企业中的应用案例分享 |
SharePoint作为技术平台,可以应用在企业办公协作的多种场景。彭斌是.net俱乐部广州的负责人。他将介绍自己工作中如何利用SharePoint提升沟通和协作效率。 |
彭斌 |
|
10:50--11:00 |
Break |
|
11:00--12:00 |
Office 12新知分享 |
3月9-10,微软Office 12专家组到北京分享了微软下一代的Office :2007 Office system,与会者为之兴奋。郭安定老师参加此次培训并将和大家分享他对Office 12的见解。 |
郭安定 |
|
12:00--13:30 |
Break |
|
13:30--14:15 |
LCS深度探悉:标签的定制和应用 |
LCS标签功能,丰富了RTC解决方案成为企业应用的一个窗口和平台。本Session将向您展示如何便捷方便的实现标签自定义。 |
陈超 |
|
14:15--14:30 |
Break |
|
14:30--15:50 |
IW解决方案概述 |
Office system包含多个产品和服务器、服务。利用IW技术,能够实现个人、团队和企业效率的提升。本Session将向您介绍IW构建的解决方案框架和机会。 |
Qiang Li |
|
IW解决方案show case: |
利用Office 2003实现费用报销表格的定义,审批流程,数字签名和汇总分析。您将了解office如何简单快捷的构建专业的IT应用系统。 |
Kaneboy |
|
文档管理系统 |
|
|
预算系统 |
|
|
16:00--17:00 |
SharePoint v3演示 |
将向您展示SharePoint v3的最新技术特性。特别向您展示SharePoint workflow的工作原理和特性。 |
Kaneboy |
|
17:00--17:30 |
Discussion |
每季度一次的OTEC会议又即将于3月25日在广州召开。我在会上有两个Session,一个是介绍前阵子我们做的一个文档管理解决方案的演示,另一个是介绍下个版本的SharePoint Server 2007中的工作流。
欢迎OTEC新老会员们积极参与,也欢迎OTEC老会员们带着新鲜血液加入到OTEC中来!
这个《Office with .Net》系列的最终目标和重头肯定是VSTO2005,希望能够尽快写到VSTO2005的部分。
点击此处查看文章。
在《Office with .Net (二) ――― 使用.Net访问Office编程接口》一文中,已经介绍了使用Office Automation(Office自动化)技术,在.Net代码中通过Office PIA直接访问Office编程接口。比如,在那篇文章中,我们创建了一个C#编写的WinForms程序,在程序中直接启动Word,用代码操作Word自动完成一些工作,然后再用代码将Word关闭。
凡是涉及到使用Office Automation,即通过自定义的代码启动Office,操作Office编程接口完成一些工作(不管是在WinForms程序,或是ASP.NET程序中),都不可避免的会遇到一个问题,就是如何“彻底干净的”将代码启动的Office程序关闭掉。实际上,如果没有处理好这个问题,那么会造成应用程序所在计算机上,相关的Office进程始终无法关闭,而如果应用程序运行在一台服务器上,那么造成的后果也更加严重,甚至可能导致服务器资源耗尽而宕机。
一、服务器端场景
服务器端Office Automation就是指我们在一个位于服务器端运行的程序中,访问Office编程接口,启动Office程序,操纵Office完成某些自动化操作。比如,在一个ASP.NET程序,或者在一个Windows Service中,都是服务器端Office Automation场景。
服务器端Office Automation的第一准则就是:不要在服务器端进行Office Automcation操作!甚至在服务器上进行Office Automcation操作是不被微软所Support的!
没错,因为在服务器端进行Office Automcation操作是非常非常危险的行为,Office原本就不是被设计成以无人值守方式运行的,就是说,Office程序在设计的时候,总是默认假定有一个真正的用户坐在计算机前,用鼠标和键盘与Office程序进行交互。而如果我们用代码来操作Office,那么实际上已经打破了这个假定。打破这个假定可能带来哪些问题呢?下面列举了一些常见的问题:
(1)由于Office总是假定当前有一个真正的“用户”在使用它,所以,它可能在某些时候会主动弹出一些窗口,要求用户与之交互。比如,当某个操作没有成功完成,或发生一些非预见情况时(比如Office要打印却发现没有打印机、要保存一个文件却发现已存在同名文件),Office会显示一个模式窗口,提示或询问用户一些信息,而在哪些时候会出现这些窗口是不能被完全预见的。由于我们的代码不能取消这样的模式窗口,那么当前进程会被完全堵塞,失去响应。
(2)作为一个在服务器端运行的组件,必须事先被设计成能够被多个客户端重复使用、开销尽可能少,而Office恰恰相反(因为Office原本就是设计成在客户端被使用),每个Office应用程序都占用大量的资源,也很难被重复使用。
(3)大家日常使用Office的时候,应该能够经常看到Office会出现一个“正在准备安装…”的对话窗口,这是因为Office引入了一种叫做“首次使用时安装”的安装模式,某些组件有可能在第一次被使用到时才去安装它。而如果在服务器端出现这样的情形,那么服务器的稳定性就很难保证了。
(4)Office总是假定当前的运行环境中,是一个真实用户的账号身份,但是服务器端Office Automation有时候却是使用一些系统账号(比如Network Service、IUser_Machine之类的)来运行Office,这时Office很可能会无法正常启动,抛出错误。
所以,除非万不得已,不要进行服务器端Office Automation操作!但是,有时候很多事情并不是由程序员决定的,所以还是有不少人铁了心、咬着牙,非得在服务器端做这个操作不可。如果你真的已经下定了决心,并且有信心克服遇到的一切困难,那么下面提供一些服务器端Office Automation的建议,供大家参考。
(1)尽可能的预防Office主动弹出一些用户交互窗口。比如,修改Application的AskToUpdateLinks、AlertBeforeOverwriting、DisplayAlerts、FeatureInstall这些属性的值,都能够预防一些用户交互窗口的弹出。另外,在编写代码时主动进行防御也很重要,比如在保存一个文件之前,先用代码检测一下是否已经有同名文件存在,打开一个文件之前,也用代码先检测一下是否文件确定存在。
(2)将运行Office的环境隔离起来。不要直接在ASP.NET代码中创建Office应用程序的实例,否则出现问题以后,IIS都可能宕掉。创建一个单独的应用程序,来进行Office Automation的操作,然后让ASP.NET程序与这个单独的应用程序通讯,间接访问Office的功能。如果有条件,甚至最好将进行Office Automation操作的单独应用程序放在一台单独的服务器上运行,这样如果真的出现异常情况,可以直接重新启动这台服务器而不影响真正业务系统的正常运行。另外,让那个单独的应用程序使用一个特定的账号运行(比如新创建并设置好的一个可以进行客户交互的账号)。
(3)最好创建一个单独的守护进程,检测是否Office没有被正确关闭,如果发现这样的情况,在守护进程中直接关闭掉Office相应进程。
二、在代码中关闭Office应用程序
当我们在.Net代码中访问Office编程接口时,COM Interop在底下会创建一个RCW(Runtime Callable Wrapper,运行时远程访问包装器),来维护对Office COM组件的引用。为了让Office能够被正常关闭,关键就是要在代码中释放掉对Office 相关对象的引用。
下面介绍了多种保障措施,让Office应用程序能够被正常关闭,在某些情况下,使用最简单的一种方式即可,而在某些情况下,则可能需要将多种方式综合起来使用。
0、记得调用Application.Quit()方法
呵呵,还真有程序员忘记调用这个方法来退出Office应用程序,不管最后用哪种方法保障关闭Office,却忘记调用这个Quit()方法,那什么都是白搭。
1、让垃圾回收完成所有工作
由于.Net Framework提供了垃圾回收器来进行内存的自动管理,所以原理上,只要我们的代码中释放掉对Office相关对象的引用(将其赋值为null),那么垃圾回收最终会将这个对象回收,那时RCW会相应的释放掉Office COM组件,使Office被关闭。为了保证关闭的即时性,我们最好主动调用垃圾回收,让垃圾回收立即进行。
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
// 进行某些操作…
Object missing = Type.Missing;
wordApp.Quit(ref missing, ref missing, ref missing);
wordApp = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
在大部分情况下,这种方法已经可以让我们的代码释放掉对Office的引用,使Office被关闭掉。
2、调用System.Runtime.InteropServices.Marshal.ReleaseComObject()方法
ReleaseComObject()方法可以使RCW减少一个对COM组件的引用,并返回减少一个引用后RCW对COM组件的剩余引用数量。我们用一个循环,就可以让RCW将所有对COM组件的引用全部去掉。
先创建一个单独的方法,释放一个Office相关对象的所有引用。
private void ReleaseAllRef(Object obj)
{
try
{
while (ReleaseComObject(obj) > 1);
}
finally
{
obj = null;
}
}
然后,调用这个ReleaseAllRef()方法即可。
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
// 进行某些操作…
Object missing = Type.Missing;
wordApp.Quit(ref missing, ref missing, ref missing);
ReleaseAllRef(wordApp);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
(3)明确单独声明和释放每一个中间对象变量
中间对象变量就是指代码中直接通过一个对象的属性得到的一个对象,不单独声明它,而再次直接使用它。比如:
Document doc = wordApp.Documents.Add(…);
上面的代码中,wordApp.Documents这个属性实际是一个Microsoft.Office.Interop.Word.Documents类型的对象,但是上面的代码没有单独声明这个对象,而是直接使用了它的Add()方法。如果要单独声明它,则需要更改成如下:
Documents docs = wordApp.Documents;
Document doc = docs.Add(…);
在使用完这些对象后,使用(2)中所描述的方法,再一一释放掉它们。
doc.Close(...);
ReleaseAllRef(doc);
ReleaseAllRef(docs);
wordApp.Quit(...);
ReleaseAllRef(wordApp);
三、最后的总结
这篇文章的标题是《“彻底干净的”关闭Office程序》,之所以在“彻底干净的”这个修饰上打上引号,原因就是其实是没有任何一劳永逸的、100%有效的方法,关闭掉Office程序。任何进行了Office Automation操作的代码,都必须被仔细测试和评估,将其对我们的程序所造成的影响,降到最低。
从06财年开始(2005/8),我们IW Team(会有朋友不知道什么是IW吗?)增加了一位同事,专门负责OPS,OPS即Office Professional Solution,如何清晰明了的解释OPS是个什么东东的确是一个令人头疼的问题。用排除法来说的话,凡不是企业信息门户、企业项目管理、即时通讯、内容管理的其他IW解决方案,都可以归类为OPS。其实我更喜欢Office SmartClient这个定义,虽然从范围来说Office SmartClient不足以包含OPS,但是它的定义更清晰。将客户端的Office作为企业应用的前端,通过前端的这些Office智能客户端展现、输入、操作后端的应用系统,我们就可以认为这是一个Office SmartClient应用。
不管叫什么名字,都可以看出微软对于Office开发是越来越看重的。从开发人员的角度,我写了一些针对Office进行开发的文档,希望能够对Office开发人员们有帮助。这里贴出来的是系列文章的第二篇《Office with .Net (二) ――― 使用.Net访问Office编程接口》。
点击这里查看文章。
写完这篇文章,终于长吁一口气,整个10月份没有写一篇blog,现在时刻担心开心把俺给踢出博客堂。:)
补充:如果希望应用构建在Office XP上,可以选择使用Office XP PIA,Office XP PIA可以应用于Office XP和Office 2003。点击
这里下载Office XP PIA。
当使用Office Communicator 2005连接Live Communication Server 2005时,除了可以在Office Communicator帐户管理中的“配置设置”,来手工指定LCS服务器的地址和连接协议之外,还能使用“自动配置”选项,免去客户端用户的麻烦。
微软发布的
中文版LCS2005部署指南中,对于如何支持客户端的自动配置进行了描述,但是这些描述是基于Windows Messenger的,如果客户端使用的是Office Communicator,那么管理员会发现,按照文档所说的,并不能配置成功。
这是因为当Office Communicator连接企业网内部的LCS服务器时,会使用_sipinternal._tcp.
(或_sipinternaltls._tcp.)这条记录来进行查询,而当Office Communicator在企业网外部通过TLS连接Access Proxy时,会查询_sip._tls.这条记录。所以,如果按照文档所描述的只创建了_sip._tcp.,是不能让Office Communicator实现自动配置的。
众所周知,由于Office的接口是COM,所以在.NET代码中操作和访问Office,都需要通过Interop Assembly。从Office XP开始,微软更提供了专门的Primary Interop Assembly(PIA),来供.NET访问Office的COM接口。关于PIA,可以通过
这里进行了解,Office 2003 PIA的下载在
这里。
那么除了通过标准的COM Interop之外,在.NET代码中还能不能以更直接的方式来操作和访问Office的COM接口呢?能。实际上,System.Type这个类提供了一个GetTypeFromProgID()的静态方法,通过提供ProgID,就能直接通过Reflection来访问COM接口。
下面的代码示范直接启动Word,并创建一篇新文档,使用这段代码的项目完全不需要引用Office PIA:
Type wordType = System.Type.GetTypeFromProgID("Word.Application");
Object word = System.Activator.CreateInstance(wordType);
wordType.InvokeMember("Visible", BindingFlags.SetProperty, null, word, new Object[] {true});
Object documents = wordType.InvokeMember("Documents", BindingFlags.GetProperty, null, word, null);
Object document = documents.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, documents, null);
6月11号(本周六),我和我的同事刘斌、熊明锋将在上海主持召开Office专家技术俱乐部第二次线下聚会。这次聚会已经预定的演讲包括:
kaneboy:Office 12 XML文件格式简介
王伟:LCS2005与LCS的企业应用
陈流浩:实现微软权限管理服务
沈悦:Project 实施经验分享
张月明:基于SPS的框架 实现企业内部信息门户
张凌:编程访问SharePoint文档库
另外,如果还有空余的时间,我将给参会者现场演示一个估计大家以前没有接触过的东东:VSTO2005 for Outlook!:)
在下一个版本的Office12中,Office将使用一种新的文件格式,完全基于XML的格式。文档的内容全部使用XML文本的格式保存起来,并基于最新的Office XML Schema。Office12的XML Schema将是一种完全开放的标准,所有细节都会开放给开发人员,大家可以自由的(无版权费用的)参考其Schema来使用和处理Office12的文档。同时,Office文档文件的扩展名也会相应的改成:.docx、.xlsx、.pptx。
由于在Office文档中通常不会只包含文字内容,所以对于其他的图片、视频等信息,都会保存成单独的“子文件”,然后将一个Office文档所包含的所有“子文件”使用ZIP格式打包成一个完整的Office文档文件。实际上,用户可以使用诸如WinZIP这样的软件直接打开.docx,然后单独的查看里面的“子文件”的内容。当然,对于最终用户而言,只需要了解.docx文件就是标准的Word文档而已,其压缩/解压等处理过程对最终用户而言都是透明的。
Office12文件格式图示(了解InfoPath文件格式的朋友应该会会心一笑吧):

微软会在Office12发布后,针对旧版本的Office2000、XP、2003发布Add-in,使其能读写新的Office12格式文档。
相关资料:
Microsoft Office Open XML Formats Guide:http://download.microsoft.com/download/7/4/3/7437e747-aeaf-4419-8181-7307bae89db4/XMLFileFormatsGuide.doc
Microsoft Office Open XML Formats Architecture Guide:http://download.microsoft.com/download/E/3/D/E3DD6FED-0CC1-4788-A742-E1596179AE65/FileFormatsPreview.doc
Word开发组程序经理Brian Jones的blog:http://blogs.msdn.com/brian_jones/default.aspx
一、WSS SP2与.Net Framework 2.0
如果在运行了WSS (包括SPS2003)的Windows Server 2003上安装了.Net Framework 2.0(Beta2或之前的测试版本)之后,WSS将不能正常工作。这个问题将在WSS SP2解决掉,SP2甚至将使WSS能够在ASP.NET 2.0之下,就是说,我们可以在IIS管理器中,将承载WSS的虚拟站点设置成使用ASP.NET 2.0。
WSS运行在ASP.NET 2.0下将具有和运行在ASP.NET 1.1之下同样的特性,WSS也不能使用ASP.NET 2.0中新增的WebPart功能,WSS中的WebPart仍然是和ASP.NET 2.0中的各自成一套。但是WSS将享受到.Net Fx 2.0带来的CLR性能和效率上的提升。
二、VSTO2003与.Net Framework 2.0
我已经在我的电脑上安装了.Net Framework 2.0 Beta2,当我使用VS2003创建VSTO项目后,却发现当Word载入VSTO程序集时,总是提示“.Net安全策略不允许运行此程序集”,但我能肯定在.Net Framework 1.1设置控制台中已经给这个程序集FullTrust的信任。
经过一番尝试,我发现Office2003中的CLR Loader会自动使用安装在计算机上的最新的.Net Framework版本,并使用这个最新的CLR来运行VSTO的程序集。所以.Net Framework 1.1的安全设置并不能对2.0产生影响,只需要在.Net Framework 2.0设置控制台中增加对这个程序集的FullTrust信任,就能正常工作了。
但是上面的解决方法不能让我们在VS2003中对VSTO项目进行Debug,VSTO2的Blog上有一个解决方法,不过这个方法...未免太不“厚道”了。不过,VSTO2的巨大改进的确让人印象深刻,相比之下,VSTO则给人“原始社会”的感觉,我强烈推荐Office开发人员们都开始尝试VSTO2!
Office System已经不仅仅意味这文字编辑软件、表格处理软件的集合了,而逐渐成为了企业应用不可或缺的组件。从后台的SharePoint Portal Server、Project Server,到前端的Office SmartClient技术(智能文档、智能标签、VSTO、IBF...),Office System在企业应用中的作用越来越重要,Office开发人员在整个企业应用系统的开发中的地位也越来越突出!由微软公司主持的Office技术专家俱乐部(OTEC),在2005年3月份正式成立了!
俱乐部的正式会员能够得到的资源包括:
* 定期的俱乐部电子刊物
* 每月的中文TechNet光盘
* 不定期的Office技术光盘
* 优先获得Office相关技术的信息
* 微软市场活动和技术讲座的优先参与权
* 线下的俱乐部聚会
* 在俱乐部论坛中直接获得一定的微软公司技术支持
* ......
从3月份下旬开始,将在北京、上海、广州三地陆续召开俱乐部的首次线下聚会,在聚会上,成员们将就自己拿手的技术专题,给其他人分享多场精彩的技术讲座。
欢迎所有Office爱好者访问OTEC社区:
http://otec.mscommunity.com/forums/。We Believe Office !
上一篇Blog向大家介绍了智能标签。如前所说,开发智能标签程序并非很“舒适”,尤其是在部署上,因为我们必须将COM组件注册到计算机上,然后将其ClsID加到位于注册表的智能标签列表处。而如果使用SmarterTag(注意这个名词和SmartTag的区别),这个托管包装器来开发智能标签程序,那就爽多了。
首先,在这里下载SmarterTag,除了SmarterTag之外,还有一个QuickStart可以下载,QuickStart是一个项目源码,演示了如何开发一个SmarterTag项目。
将下载的SmarterTag中的文件解压到磁盘上的某处,比如“C:\SmarterTag”,然后运行reg.bat文件,将SmarterTag注册到计算机上。然后我们要做的,就是打开VS.NET 2003,创建一个普通的类库项目,并且在项目中引用Microsoft.PRC.Office.SmarterTag.dll程序集。
下面演示的,是开发一个能够寻找到正文中的“kane”,然后显示一个标签,上面的菜单操作可以将正文中的“kane”修改为“kaneboy”的智能标签(这个示范也包含在QuickStart里面)。效果图如下:


一个SmarterTag必须实现ISmarterTag接口:
public class FindKaneboy : ISmarterTag
ISmarterTag接口要求我们的类实现如下的方法和属性:
public void Init(String applicationName)
{
// 初始化代码
}
Init()可以让我们的SmarterTag在载入时,进行一些初始化工作。比如从后台载入客户名单等等。
public Boolean IsMatch(String text)
{
return text.ToLower().Trim() == "kane";
}
IsMatch()用来判断参数中的文本是否符合智能标签要标记的文本。在这里,只要文本是“kane”就行了。
public String[] ActionTypeNames
{
get
{
return new String[] {"SmarterTag.QuickStart.ReplaceKane, SmarterTag.QuickStart"};
}
}
ActionTypeNames属性的作用是,决定在智能标签的菜单上,要出现哪些菜单项。每个菜单项都是一个实现了IAction接口的类。这里需要返回一个字符串数组,数组里面的每个元素,是一个菜单项对应的类的类型全名。这个返回的字符串数组的数量,也就决定了智能标签上会显示多少个操作菜单项。
接着我们就要构建一个实现了IAction接口的类了,IAction表示智能标签上的一个菜单项:
public class ReplaceKane : IAction
IAction只有一个属性和一个方法需要实现:
public String Caption
{
get
{
return "补充为“kaneboy”";
}
}
Caption属性返回要显示在菜单项上的文本。
public void InvokeAction(Object target, String applicationName, String text)
{
Range rng = target as Range;
Object start = rng.Start;
Object end = rng.End;
Range rng2 = rng.Document.Range(ref start, ref end);
Object unit = WdUnits.wdCharacter;
Object count = 3;
rng2.MoveEnd(ref unit, ref count);
if (rng2.Text != "kaneboy")
{
rng.Text = "kaneboy";
}
}
OK,InvokeAction()方法稍微复杂一点,因为这个方法就是当用户点击智能标签上的这个菜单项时,要执行的代码。target参数表示在宿主程序(host application)中智能标签所标记的那块文本区域所对应的对象。宿主程序的不同,这个对象类型也不尽相同,对于Word而言,target是一个Range类型的对象。第二个参数applicationName标识了宿主程序的名称。第三个参数text是智能标签所标记的文本内容。
在上面InvokeAction()方法中,代码将智能标签所标记的文本内容从“kane”修改为了“kaneboy”。
由于我们编写的是完全的.Net程序,所以InvokeAction()是可以做任何.Net代码可以做的事情的(在权限允许的情况下)。比如显示一个MessageBox,或者显示一个WinForms窗口,或者调用WebService......这里就是业务逻辑代码的主要落脚点。
QuickStart中另外包含的SmarterTag识别了“kaneboy”,和上一篇Blog所说的那个标记博客堂最新文章作者的智能标签。
