首页 > 编程资源分享区 > C/C++源代码共享 > 使用C++和XML建立智能文档(一)
2006
03-09

使用C++和XML建立智能文档(一)

摘要:Office 2003中最“酷”的部分之一是称为“智能文档(Smart Document)”的可编程能力特性,它允许开发者使用可编程的内容和操作来扩充Word和Excel文档。在典型情况下,演示Office的可编程能力的示例使用的都是Visual Basic或Visual Basic .NET的。在本文中,作者使用C++为Excel开发了一个智能文档。他描述了新的ISmartDocument接口并演示了如何使用该接口管理一个类似Excel电子表格的简单事务列表。

目录


智能文档的概念
建立智能文档
开始


智能文档是微软Word 2003和Excel 2003中新的可编程特性。开发者可以建立用可编程代码片段增强了的Word或Excel智能文档,以辅助用户建立和修改它们。重复使用模版内容、为如何格式化或完成文档实现业务规则、通过正式批准的过程路由(routing)文档等等过程,Office智能文档都可以简化。


多年以来利用ActiveX和Visual Basic for Applications (VBA)在自定义的解决方案中使用微软Office应用程序是可行的。但是它们有一些限制,特别是在布署、用户界面和安全性方面。智能文档把Office XP引入的流行的“任务面板”接口和自定义解决方案之间紧密集成,从而解决了这些问题。有了智能文档,你就能用XML定义自定义事务面板内容,它能把帮助、指令和可编程控件自动地与用户在文档中的位置同步。自定义事务面板控件的代码可以使用多种语言开发:Visual Basic 6.0、Visual Basic .NET、Visual C++或Visual C#。


当用户简单地打开来自可信服务器的文档或电子邮件中的附件的时候,智能文档和相关的组件就会被安装。它们可以自动从可信的服务器上更新自身,极大的简化了更新的布署。智能文档遵循Office安全性设置,要求它们下载自可信服务器并有可信源的签名。你可以为用户提供一个控件以决定是否打开不符合执行安全性标准智能文档


尽管目前有很多好的跟踪进度表的解决方案,但是我还是把这种进度表作为存储在Excel中的数据库,因为我希望你简单地安装Office 2003并下载本文的代码后,不需要安装其它的任何附加产品就能使用这个解决方案。


在电子表格中每个包含有用信息的进度表数据项都有一行记录:谁在做这个事务、估计完成这个事务需要的时间总计、这个事务是否已经完成。我假定在项目小组,开发者每周更新这个进度表以反映上一周的工作情况。此外,由于我希望知道小组正在进行什么事务,我将要求他们确定下一周将做什么事务。这也是对进度估计什么时候进行修改的时间。我建立的智能文档解决方案能把所有这些进度改变包装为良好格式化的Word状态文档——这恰好是经理们喜欢的。作为附带的优点,我将给状态文档使用Word的新的XML特性。实际上,我的Excel智能文档解决方案将生成一个XML状态摘要,我将在Word中把这个摘要与XSLT结合起来以得到良好格式化的文档。


智能文档的概念


在Office 2003智能文档解决方案中有五个主要的部分。首先,要有Word文档或Excel模版。它是用户打开以执行业务功能的智能文档——在例子中为每个软件项目生成了一个良好格式化的每周状态报告。请注意,在Office 2003中,只有Word和Excel支持智能文档。


其次,要有XML大纲定义(XSD)。Word文档或Excel电子表格都使用来自XML大纲的元素作记号,用于覆盖全部或部分文档或工作簿上面的XML数据模型。例如,在项目进度工作簿中,有一个项目名称(Project Name)单元和一个开发者姓名(Developer Name)单元。它们分别与XML大纲中的ProjectName和DeveloperName元素对应。“做标记”就是工作簿开发者如何把这些特定单元与XML大纲元素关联。


第三,你要有操作处理程序(action handler)DLL,可以在Visual Basic、Visual Basic .NET、Visual C++或Visual C#中开发它。接着把它被布署到Web或网络服务器上。这个DLL实现了ISmartDocument OLE接口。


第四,要有说明解决方案安装指令的XML扩展包清单文件。它提供了解决方案DLL的服务器位置和解决方案的COM CLSID。同时它还记载了其它一些与解决方案关联的文件和解决方案的ID。解决方案的ID唯一地标识了该智能文档解决方案。尽管你可以把任何唯一的标识符字符串作为解决方案的ID,但是最好使用生成的GUID。


最后,要有你希望安装到本地计算机的解决方案需要的其它文件(例如GIF或JPEG、HTML或文档片段)。这些都必须在清单文件中指定,当打开智能文档的时候被Office自动地安装或更新。这样它们才能被智能文档解决方案的代码使用。


我要阐明一下示例中每个文档的角色,智能文档是附带了XML大纲和自定义逻辑的文档——在示例中,它是Excel电子表格。我生成Word文档这个事件是偶然的,我也能轻易的把信息放入数据库中或生成一个PowerPoint演示文稿。


你可以考虑一下XML元素,它们把电子表格或文档分解为逻辑结构的组件,就像钩子一样,智能文档解决方案能够在文档的不同部分中附加控件以辅助用户工作的。这些控件的行为是在运行的时候由你的操作处理程序DLL定义的。这些控件实际上变成了一个完善的内容敏感的(context-sensitive)帮助系统,当用户移动进入文档或电子表格的特定部分(与XML元素对应)的时候,它们显示在新文档的操作事务面板中。因为智能文档控件不仅仅是帮助文本,所以你的内容敏感帮助实际上作为用户的助手,帮助用户完成使用该文档的业务事务系统。


建立智能文档


生成智能文档解决方案的涉及到的大多数工作包括建立一个Word或Excel文档,并把XML元素与它关联。实际上,你一般可以把已有的Word或Excel文档作为建立智能文档的基础。因为多数业务文档已经有了一定的结构,当你定义XML元素的时候仅仅需要对它进行形式化(formalize)和命名。


从开发者的角度看,该文档或电子表格是解决方案的基本UI。当用户编辑的时候,智能文档操作处理程序DLL定义了出现在该文档旁边的附加的UI。在可能的情况下,在建立智能文档的时候使用Word和Excel的下层能力,而不是在智能文档DLL中编写自定义代码是明智的。我的Excel进度表工作薄中的公式就演示了这一点。我希望在上一周的星期一得到状态报告,但是人们通常在星期一或星期四添加状态报告;在这以后是本周的星期一了。我不是编写一段C++代码实现这种操作,而是编写了Excel公式来压缩这个计算过程并把它放在工作表的一个单元中:


=IF(WEEKDAY(TODAY(),3)<2,
    TODAY()-(7+WEEKDAY(TODAY(),3)),
    TODAY()-WEEKDAY(TODAY(),3))
 


我简单地使用一个自己编写的从Excel工作薄中得到值的函数从该工作表单元中载入计算过的日期值。


开始


现在我们从建立一个Excel电子表格以跟踪软件进度表开始。注意,我假定你已经下载了示例代码,它包含了必要的支持文件。


启动微软Excel 2003并打开Project Schedule (Original).xls。这个电子表格与大多数Excel电子表格一样,已经有了一个结构。现在使用XSD文档(例子中是ScheduleSmartDocument.xsd)把一个XML大纲与这个结构关联。在Excel中,点击“数据”菜单下的“XML”并选择“XML源”。当“XML源”事务面板出现的时候,点击“工作薄映射”按钮并添加ScheduleSmartDocument.xsd文件。接着点击“确定”关闭“浏览”对话框,再次点击“确定”关闭“XML映射”对话框。显示了添加大纲后的Excel“XML源”事务面板。


为了建立映射,你必须把元素从XML大纲中拖到工作薄上。对于类似Project Name和Developer的元素,这是很简单的事情,只需要把该XML元素名称从“XML源”事务面板上拖动到包含相关数据的工作薄单元上(例如,把ProjectName拖动到A2上)。对于分层显示的重复的进度表数据项,可以通过选择数据项把该组拖动到标题行(A5)上。你可以通过选择“XML源”事务面板中特定的元素(例如Description)来确认映射关系;工作薄中相应的部分应该高亮度显示。把结果工作薄保存为Project Schedule (Mapped).xls。在示例中,我将建立单个电子表格,或者你可以把进度表保存为Excel工作薄模版。这样的话,你就简化了用户建立该文档的新副本的过程,每个新的副本都将成为一个Excel智能文档。【未完待续】


下一篇:《使用C++和XML建立智能文档(二)》


原文标题:《Create Word and Excel Smart Documents with C++ and XML》


原文作者:Mike Kelly


原文链接: http://msdn.microsoft.com/msdnmag/issues/03/12/SmartDocument s/default.aspx


代码下载:


http://download.microsoft.com/download/a/5/f/a5f7e731-af88-4 76e-9d57-02b44945ed3a/SmartDocuments.exe  


留下一个回复