使用C++和XML建立智能文档
发布时间2004.01.0715:41 来源赛迪网作者Mike Kel ly,陶刚编译
关键字智能文档(Smart Document ) XML大纲定义(XSD)接口( interface)
摘要Off ice 2003中最“酷”的部分之一是称为“智能文档(Smart Document) ”的可编程能力特性它允许开发者使用可编程的内容和操作來扩充Wo r d和Ex c e l文档。在肌型情况下演示Office的可编程能力的示例使用的都是Visual Basic或Visual Basic . NET的。在本文中作者使用C++为Exce l开发了一个智能文档。他描述了新的TSmar tDocument接口并演示了如何使用该接口管理一个类似Excel电了表格的简单事务列表。
一、建立智能文档
智能文档是微软Word2003和Excel 2003屮新的町编程特性。开发者可以建立川可编程代码片段增强了的Word或Exce l智能文档以辅助川户建立和修改它们。重复使川模版内容、为如何格式化或完成文档实现业务规则、通过正式批准的过程路由(rout ing)文档等等过程Of f ice智能文档都可以简化。
多年以來利MJ ActiveX和Visual Basic for Appl icat ions (VBA)在H定义的解决方案屮使用微软Office应用程序是可行的。但是它们有一些限制特别是在布署、用户界面和安全性方面。智能文档把Office XP引入的流行的“任务面板”接口和自定义解决方案Z间紧密集成从而解决了这些问题。有了智能文档你就能用XML定义口定义事务而板内容,它能把帮助、指令和可编程控件口动地与用八在文档中的位置同步。口定义事务而板控件的
代码可以使用多种语言开发:Visual Basic 6.0 、Visual Basic .NET、Visual C++或Visual C#o
当用户简单地打开来自可信服务器的文档或电了邮件中的附件的时候智能文档和相关的组件就会被安装。它们可以口动从可信的服务器上更新口身极大的简化了更新的布署。智能文档遵循Office安全性设置要求它们下载自可信服务器并有可信源的签名。你可以为用户提供一个控件以决定是否打开不符合执行安全性标准智能文档
尽管目询有很多好的跟踪进度表的解决方案但是我还是把这种进度表作为存储在Ex c e l屮的数据库因为我希望你简单地安装Office 2003并下载木文的代码后不需要安装其它的任何附加产品就能使用这个解决方案。
在电了表格屮每个包含有用信息的进度表数据项都有一行记录谁在做这个事务、估计完成这个事务需要的时间总计、这个事务是否已经完成。我假定在项冃小组开发者每周更新这个进度表以反映上一周的工作情况。此外由于我希望知道小纟R正在进行什么事务,我将要求他们确定下一周将做什么事务。这也是对进度估计什么时候进行修改的时间。我建立的智能文档解决方案能把所有这些进度改变包装为良好格式化的Word状态文档——这恰好是经理们喜欢的。作为附带的优点我将给状态文档使用Wo r d的新的XML特性。实际上,我的Ex c e l智能文档解决方案将生成一个XML状态摘要我将在Wo r d屮把这个摘要与XSLT结合起来以得到良好格式化的文档。
智能文档的概念
在Office 2003智能文档解决方案小有五个主要的部分。首先要有Word文档或Excel模版。它是川户打开以执行业务功能的智能文档——在例子屮为每个软件项目生成了一个良好格式化的每周状态报告。请注意,在Office 2003只有Word和Excel支持智能文档。
其次耍有XML大纲定义(XSD) o Wo rd文档或Exce l电子表格都使用来口XML大纲的元索作记号用于覆盖全部或部分文档或工作簿上面的XML数据模型。例如在项目进度工作簿中有一个项冃名称(Proj ect Name)单丿匸和一个开发者姓名(Developer Name)单元。它们分别与XML大纲中的Proj ectName和DeveloperName元索对应。 “做标记”就是工作簿开发者如何把这些特定单元与XML大纲元素关联。
第三你要有操作处理程序(act ion handler) DLL,可以在Visual Basic>Visual Basic .NET、Visual C++或Visual C#中开发它。接着把它被布署到Web或网络服务器上。这个DLL实现了ISmartDocument OLE接口。
第四要有说明解决方案安装指令的XML扩展包清单文件。它提供了解决方案DLL的服务器位置和解决方案的COM CLSTDo同时它还记载了其它一些与解决方案关联的文件和解决方案的IDo解决方案的ID唯一地标识了该智能文档解决方案。尽管你对以把任何唯一的标识符字符串作为解决方案的TD,但是授好使用生成的GUTDo
最示要有你希望安装到木地计算机的解决方案需要的其它文件(例如G I F或J PEG、HTML或文档片段) 。这些都必须在清单文件屮指定当打开智能文档的时候被Office |z|动地安装或更新。这样它们才能被智能文档解决方案的代码使用。
我耍阐明一下示例中每个文档的角色智能文档是附带了XML大纲和口定义逻辑的文档——在示例中它是Exce l电子表格。我主成Wo rd文档这个事件是偶然的我也能轻易的把信息放入数据库中或生成一个PowerPoint演示文稿。
你可以考虑一下XML元素它们把电子表格或文档分解为逻辑结构的组件就像钩子一样智能文档解决方案能够在文档的不同部分中附加控件以辅助用户工作的。这些控件的行为是在运行的时候由你的操作处理程序DLL定义的。这些控件实际上变成了一个完善的内容敏感的
(context -sensi t ive)帮助系统当川户移动进入文档或电了表格的特定部分(与
XHL元素对应)的时候它们显示在新文档的操作事务而板屮。因为智能文档控件不仅仅是帮助文木所以你的内容敏感帮助实际上作为用户的助手帮助用户完成使用该文档的业务事务系统。
建立智能文档
生成智能文档解决方案的涉及到的人多数工作包括建立一个Wo r d或Ex c e l文档并把XML元素与它关联。实际上你一般可以把己有的Word或Excel文档作为建立智能文档的基础。因为多数业务文档已经有了一定的结构当你定义XML元素的时候仅仅需要对它进行形式化(formal ize)和命名。
从开发者的角度看该文档或电了表格是解决方案的基木UI 。当用户编辑的时候智能文档操作处理程序DLL定义了出现在该文档旁边的附加的U I 。在可能的情况下在建立智能文档的时候使用Word和Excel的下层能力而不是在智能文档DI丄中编写自定义代码是明智的。我的Excel进度表工作薄中的公式就演示了这一点。我希望在上一周的星期一得到状态报告但是人们通常在星期一或星期四添加状态报告在这以示是木周的星期一了。我不是编写一段C++代码实现这种操作而是编写了Excel公式來压缩这个计算过程并把它放在工作表的一个单元中
我简单地使用一个a己编写的从Excel工作薄中得到值的两数从该工作表单元中载入计算过的LI期值。
开始
现在我们从建立一个Excel电子表格以跟踪软件进度表开始。注意我假定你己经下载了示例代码它包含了必要的支持文件。
启动微软Excel 2003并打开Project Schedule (Original ) , xlso这个电子表格与大多数Excel电子表格一样已经有了一个结构。现在使用XSD文档(例子中是ScheduleSmartDocument . xsd)把一个XML大纲与这个结构关联。在Exc e l中,点击“数据”菜单下的“XML”并选择“XML源” o当“XML源”事务面板出现的时候点击“工作薄映射”按钮并添加ScheduleSmartDocument . xsd文件。接着点击"确定”关闭"浏览”对话框再次点击“确定”关闭“XML映射”对话框。图1显示了添加大纲后的Exce l "XML源” 事务面板。
:XML Source ▼X
XML maps in this workbook:
伺ProjectName伺Developer j•““HF StartDate
BItem
IJ Group
| • • • •昌ID
1J AssignedTo
I••“dtEsam
U OriginalEstimateHt IJ匚urrentEstimateHc IJ
SpentHoursj••• •僅T Doneid Comments
图l .XML源
为了建立映射你必须把元素从XML大纲中拖到工作薄上。对于类似Proj ect Name和Developer的元素这是很简单的事情只需要把该XML元素名称从“XML源”事务而板上拖动到包含相关数据的工作薄单元上例如把Proj ectName拖动到A2上 。对于分层显示的重复的进度表数据项可以通过选择数据项把该组拖动到标题行A 5上。你可以通过选择“XML源”事务面板中特定的元素例如Description来确认映射关系;工作薄中相应的部分应该高亮度显示。把结果工作薄保存为Project Schedule Mapped , xlso在示例中我将建立单个电子表格或者你可以把进度表保存为Excel I作薄模版。这样的话你就简化了用户建立该文档的新副本的过程每个新的副本都将成为一个Excel智能文档。
二、 ISmartDocument接口教程
下一步是建立智能文档操作DLL并安装它。在你编写智能文档操作处理程序DLL 它实现了ISmartDocument接口方法之前最好先了解-下这个接口。
当用户在文档中移动的时候你的操作处理程序DLL将建立并管理一组出现在文档操作事务面板屮的控件允许你基于文档屮的位置提供自定义的用户界面。映射到文档的XML大纲元素定义了用户在文档中的位置。XML元素应该指定给用户显示哪些控件。图2显示了你可以建立的控件类型。你将使用操作处理程序DI丄中实现的ISmartDocument接I I的方法建立这些控件。当这些控件被激活的吋候例如进入了文本框或者点击了某个按钮 Office通过ISmartDocument接I I方法调用你的H定义操作处理程序DLL代码。
图2.智能文档控件类型
我把TsmartDocument接口的方法分为几类配置方法它为Office描述了建立在文档操作事务面板中的控件图3 控件绘制时d “w-t ime方法它们作为控件调用并绘制在事务面板上图4 修改通知方法Office把它们作为文档操作事务面板控件调用,由用户维护图5 。
图3. ISmartDocument接口配置方法
图4. TSmart Document接口控件绘制方法
三、访问智能文档内容
为了能起到作用你的智能文档操作DLL一般需要访问并且可能修改下层的Of f i ce文档。在例了中它是Exce l项目进程表电了表格。为了这个目的 ISmartDocumcnt的儿个方法为你下层文档提供了一个IDispatch COM接口指针。在Off ice上编写COM的人知道, Idispatch提供了进入Office对象模型的通道。在VisualBasic中使用Idispatch和类型库是相当H动化的但是在C++屮稍微复杂一些。
起先我准备使用#import指令它允许Visual C++为类型库屮的所有接口生成ATL智能指针包装。但是要让它正确的编译需要做大量的工作它常常提示有东西出错了。果真,我找到了知识库文章"Office Appl ication Remains in Memory After Program Finishesw ,它描述了在Office类型库中使用tt import指令所遇到的知名的问题以及相应的建议。
最后我决定建立自己的类CexcelWorkbook来包装盂要的Excel方法。这个类继承自ATL模版CcomDispatchDriver,这使它相对容易通过IDispatch调用Excel对象模型上的方法。使用CcomDispatchDri ver的方法Get IDOfName,你口j以得到一个给定的属性或方法例如Excel对象模型中的Act iveSheet的范围的DISPID。你一旦冇T DISPID 为了效率更高我在类中对它进行了缓冲处理 就可以使用某个其它的CcomDispatch方法例如GetProperty或InvokeN,此处的N是参数的数呈 访问对象模型中的属性和方法。注意Exco Range值是作为VBA属性而不是方法暴露的但是它也需要一个参数范围地址 。因为CcomDi spatchDriver没冇提供为GetProperty调用传递的参数的途径我在自左义类CExcelWorkbook中实现了一个新的方法GetProperty 1 它用于处理这种情况。
调试智能文档DLL
一切都在预料Z中在我尝试建立智能文档操作DI丄的时候也没冇出现异常。我试图在Excel+附加一个XML人纲的时候收到了一个错课信息“XML扩展包逻辑丢失或无效” 。为了调试这个错课我首先使用ListDLLs ht tp: //www. sysinternals . com上的一个方便的工具确定Excel是否载入了我的库这样清单才能看起来足够好它可以让Exc e l找到该DLL的。我退出Ex c e l ,接着修改了项目的Debugging属性右键点击解决方案并选择“属性” 告诉Visual Studio使用Excel作为该DLL的EXE容器。我浏览Ex c e l , e x e并选择它作为Comm a n d值。
接着我按T Ctrl -B打开"New Breakpoints”对话框,在Funct ion字段中输入Dl lMain,当出现"disambiguate symbol”窗口显然有两个重载的Dl lMain函数的时候选择了它们两个通过这些操作在Dl lMain中设置了一个断点。我的目的是当Excel第一次调用该DLL的时候得到控制权。接着我按FF5,Excel启动了。Visual Studio警告没有Excel符号但是我早就知道了。我打开智能文档,使用Data | XML | XML Expansion Packs试图再次附加XML大纲。Visual Studio同ATL生成的Dl lMain中的断点一起出现了。
这个时候我的目标是确定DLL屮是否有方法、哪些方法被调用了。我在自己的I smartDocument接口实现中的所冇方法上设置了断点以确定它们其中的哪些被调用了。实际上有几个方法被调用了并且通过逐步运行我找到了一个普通的索引问题传递到get_SmartDocXm 1TypeNamc的控件索引是从1开始的但是C++代码把它处理为从0开始的,因此对最后一个元素的调用返回了
E_I NVAL I DARGo后来我给所有的接口方法的入口点添加了ATLTRACE2宏使自己更容易知道正在调用什么、什么时候调用。
改变通知
对于示例解决方案我需要知道用八什么时候选择了电子表格的数据项区域中的某行,这意味着他希望编辑该事务的相关信息。接着我从当前行屮抓取信息并填充事务面板允许他输入本周的工作和下一周的计划工作的相关信息。当他改变了事务而板中的某些东西的时候我将使用Excel对象模型把新的信息复制回原工作表行。但是我如何知道什么时候选择了新的行有一种比较复杂的解决方案即使用Excel事件在Visual Basic中容易但是在C++屮不是太容易 但是我发现这是没有必要的。在Excel屮无论选择什么时候发生了改变都会调用IsmartDocument接口方法因此无论什么事情你仅仅需要改变通知。通过更新每次改变后的进度表事务内部视图我能够忽略行选择的变化。
安全性
因为宏病毒和其它的脚木技术的恶意使用变得很普遍Office在两个途径做了修改通过提髙默认的安全性设置防止运行大多数没有签名的、潜在的恶意代码;通过增加安全性设置的数量为即使没有数字签名的解决方案的运行提供了更多的管理权限。这考虑了现实情况很多Office解决方案嵌入Wo r d或Ex c e l文档中的宏都已经广泛的布署在大型组织屮要让它们完全安全将花费一定时间。如果新版木Office突然要求所有的解决方案必须有数组签名理想的解决方案 这将给很多组织带來布署方而的障碍。但是Office安全性设置的增加也使安全性更加复杂在木文屮我没有谈到这个主题。
应用于宏和插件程序的相同的Office安全性设置也町应用于智能文档。这些设置包括:
•用户宏的安全性设置高、中或低,在Tools | Macro | Securi ty +设置默认的是高 。
•智能文档是否从可信 trusted位迸载入可信的文件系统目录例如每个用户的或工作组模版冃录 、公司局域网上的Web服务器或可信的Internet站点。
•智能文档组件是否是数字签名的如果是发彳亍人是否在Tools | Macro | Securi ty ITrusted Publ ishers设置为可信发行人。
•是否在Tools | Macro | Securi ty | Trusted Publ ishers H4选择了"相信所有安装了的插件程序和模版” 。
默认情况下,Tools | Macro | Securi ty中的安全性层次被设置高,Office阻止任何没有数字签名的插件程序DLL 包含智能文档操作DLL的载入。上而列举的安全性设置的其它组合可以允许
提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...
PIGYun是成立于2019年的国人商家,提供香港、韩国和美西CUVIP-9929等机房线路基于KVM架构的VPS主机,本月商家针对韩国首尔、美国洛杉矶CUVIP-AS29、GIA回程带防御等多条线路VPS提供6-8.5折优惠码,优惠后韩国首尔CN2混合BGP特惠型/美国洛杉矶GIA回程带10Gbps攻击防御VPS主机最低每月14.4元起。下面列出几款不同机房VPS主机配置信息,请留意不同优惠码。...
星梦云怎么样?星梦云好不好,资质齐全,IDC/ISP均有,从星梦云这边租的服务器均可以备案,属于一手资源,高防机柜、大带宽、高防IP业务,一手整C IP段,四川电信,星梦云专注四川高防服务器,成都服务器,雅安服务器 。官方网站:点击访问星梦云官网活动方案:1、成都电信年中活动机(封锁UDP,不可解封):机房CPU内存硬盘带宽IP防护流量原价活动价开通方式成都电信优化线路4vCPU4G40G+50...