使用C++和XML建立智能文档(一)
关键字:智能文档(Smart Document)XML大纲定义(XSD)接口(interface)摘要: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公式来压缩这个计算过程并把它放在工作表的一个单元中:
我简单地使用一个自己编写的从Excel工作薄中得到值的函数从该工作表单元中载入计算过的日期值。
开始
现在我们从建立一个Excel电子表格以跟踪软件进度表开始。注意,我假定你已经下载了示例代码,它包含了必要的支持文件。
启动微软Excel 2003并打开Project Schedule (Original).xls。这个电子表格与大多数Excel电子表格一样,已经有了一个结构。现在使用XSD文档(例子中是ScheduleSmartDocument.xsd)把一个XML大纲与这个结构关联。在Excel中,点击“数据”菜单下的“XML”并选择“XML源”。当“XML源”事务面板出现的时候,点击“工作薄映射”按钮并添加ScheduleSmartDocument.xsd文件。接着点击“确定”关闭“浏览”对话框,再次点击“确定”关闭“XML映射”对话框。图1显示了添加大纲后的Excel“XML源”事务面板。
图1.XML源
为了建立映射,你必须把元素从XML大纲中拖到工作薄上。对于类似Project Name和Developer的元素,这是很简单的事情,只需要把该XML元素名称从“XML源”事务面板上拖动到包含相关数据的工作薄单元上(例如,把ProjectName拖动到A2上)。对于分层显示的重复的进度表数据项,可以通过选择数据项把该组拖动到标题行(A5)上。你可以通过选择“XML源”事务面板中特定的元素(例如Description)来确认映射关系;工作薄中相应的部分应该高亮度显示。把结果工作薄保存为Project Schedule (Mapped).xls。在示例中,我将建立单个电子表格,或者你可以把进度表保存为Excel工作薄模版。这样的话,你就简化了用户建立该文档的新副本的过程,每个新的副本都将成为一个Excel智能文档。【未完待续】
原文标题:《Create Word and Excel Smart Documents with C++ and XML》
原文作者:Mike Kelly
原文链接:http://msdn.microsoft.com/msdnmag/issues/03/12/SmartDocuments/default.aspx
代码下载:
http://download.microsoft.com/download/a/5/f/a5f7e731-af88-476e-9d57-02b44945ed3a/SmartDocuments.exe
↓相关文章:
- · Informix动态服务器onstat选项
- · Informix SQL 的使用技巧
- · 在UNIX下的Informix-online中合理地组织表
- · 开发优质高效的Informix数据库应用程序(1)
- · Informix数据备份技巧
- · Informix 4GL写的转换成大写金额字串的函数
- · 一个批量删除临时表的sh用于informix
- · 影响CPU使用率的配置参数和环境变量
- · Ontape -r 恢复总结(1)
- · 用shell实现Informix的性能监控
- · Windows xp下的Informix connect配置方法
- · OnLine非正常结束后处理办法
- · OnLine进程被挂起后处理办法
- · Informix动态服务器表分片策略的计划和调整
- · 备份Informix-Online数据库三法
- · datetime类型简介
- · 配置Informix动态服务器中CPU虚处理器
- · online的备份详解
- · 配置和实现Informix ON-Bar的备份解决方案
- · Informix sysmaster表详解
- · JDBC连接Informix IDS
- · Sybase数据库死锁对策
- · SYBASE ASA数据库恢复方法
- · Sybase数据库简介(1)
- · SYBASE零售行业解决方案
- · SYBASE数据库日志详解
- · SQL Server 的通用分页显示存储过程
- · Oracle数据库中索引的维护(1)
- · Oracle9i的索引监视及注意事项
- · Oracle 的位图索引简述
- · 在ORACLE里按用户名重建索引的方法
- · Oracle数据库强制索引
- · 改善Oracle的索引
- · Oracle管理查询管用的sql语句
- · Oracle中的模糊查询
- · Oracle 中使用层次查询方便处理财务报表
- · 使用Oracle的Instr()与decode()函数进行多条件组合查询
- · MS SQL Server查询优化方法
- · Access使用查询
- · Access的跨库查询
- · Access 创建索引
- · 为数据库建立索引
- · 优化Microsoft Access提高速度
- · Sybase数据库的性能优化
- · 查询优化
- · 提高ORACLE数据库的查询统计速度
- · ORACLE SQL性能优化 (上)(1)
- · ORACLE SQL性能优化 (下)(1)
- · SQL Server性能分析参数
- · SQL Server 性能优化工具(1)
- · 使用索引调节向导调整应用程序的性能
- · 优化SQL Server服务器内存配置的策略
- · 影响SQL server性能的关键三个方面
- · MySQL性能优化的参数简介
- · MYSQL数据库的查询优化技术
- · 确定Oracle数据库表中重复的记录
- · Access数据库与SQLserver2000的数据互导
- · SQLServer和Access、Excel数据传输简单总结
- · SQL Server到Oracle连接服务器的实现
- · 使用SQL Server数据转换服务升迁Access数据库(1)
- · 将Access移植到SQL Server
- · 联系使用Excel和SQL(1)
- · 避免Access和SQL Server的空值冲突
- · 保护SQL Server:为安全性而安装
- · SQL Server 2000 客户端实用程序
- · 执行一个安全的SQL Server安装
- · SQL Server安全-加密术和SQL注入攻击
- · 指定文件位置优化性能
- · SQL Server备份的三个恢复模型
- · SQL Server的空值处理策略
- · 两个SQL Server维护技巧
- · 用SQL Server保持会话状态
- · 使用SQL服务器内置的错误寻找器寻找和剖析错误
- · 安装SQL Server 2000
- · SQL Server 2000 与 SQL Server 7.0 版兼容性问题
- · MS SQL Server 7.0 性能优化指南
- · MS SQL Server 7.0 的 SAP R/3 性能优化指南
- · 基于WEB的数据库查询
- · Sql Server全文搜索中文出错的问题
- · SQL Server7移动数据的6种方法

