文档使用c和xml建立智能文档[方案]

c xml  时间:2021-02-14  阅读:()

使用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的载入。上而列举的安全性设置的其它组合可以允许

老周互联24小时无理由退款,香港原生IP,28元起

老周互联怎么样?老周互联隶属于老周网络科技部旗下,创立于2019年12月份,是一家具有代表性的国人商家。目前主营的产品有云服务器,裸金属服务器。创办一年多以来,我们一直坚持以口碑至上,服务宗旨为理念,为用户提供7*24小时的轮班服务,目前已有上千多家中小型站长选择我们!服务宗旨:老周互联提供7*24小时轮流值班客服,用户24小时内咨询问题可提交工单,我们会在30分钟内为您快速解答!另免费部署服务器...

LOCVPS洛杉矶CN2线路KVM上线,洛杉矶/香港云地/香港邦联7折

LOCVPS发来了新的洛杉矶CN2线路主机上线通知,基于KVM架构,目前可与香港云地、香港邦联机房XEN架构主机一起适用7折优惠码,优惠后最低美国洛杉矶CN2线路KVM架构2GB内存套餐月付38.5元起。LOCPVS是一家成立较早的国人VPS服务商,目前提供洛杉矶MC、洛杉矶C3、和香港邦联、香港沙田电信、香港大埔、日本东京、日本大阪、新加坡、德国和荷兰等机房VPS主机,基于KVM或者XEN架构。...

趣米云月付460元,香港CN2云服务器VPS月付低至18元

趣米云早期为做技术起家,为3家IDC提供技术服务2年多,目前商家在售的服务有香港vps、香港独立服务器、香港站群服务器等,线路方面都是目前最优质的CN2,直连大陆,延时非常低,适合做站,目前商家正在做七月优惠活动,VPS低至18元,价格算是比较便宜的了。趣米云vps优惠套餐:KVM虚拟架构,香港沙田机房,线路采用三网(电信,联通,移动)回程电信cn2、cn2 gia优质网络,延迟低,速度快。自行封...

c xml为你推荐
http与https的区别http和https到底有什么区别啊???显卡温度多少正常显卡温度多少算正常?今日热点怎么删除如何彻底删除今日热点xv播放器下载求手机可以看xv格式的视频播放器机械键盘轴机械键盘蓝轴有什么作用宽带接入服务器用wifi连不上服务器怎么办blogcnblogcn网页无法正常显示,直接跳转http://www.7t7t.com/7?怎么在图片上写文字如何在图片上写字?火狐flash插件崩溃火狐浏览器flash插件崩溃怎么办厦门铁通厦门铁通固定电话的收费标准?
沈阳虚拟主机 国外免费域名网站 电信测速器 新加坡主机 免费ftp空间 Hello图床 permitrootlogin 512m shopex空间 godaddy域名优惠码 parseerror jsp空间 php空间推荐 hinet 100mbps 常州联通宽带 新世界服务器 域名与空间 东莞idc shuang12 更多