文档使用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元/月)河南BGP云服务器活动 买一年送一年4核 4G 5M

提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...

PIGYun月付14.4元起,美国洛杉矶/韩国VPS七月6折

PIGYun是成立于2019年的国人商家,提供香港、韩国和美西CUVIP-9929等机房线路基于KVM架构的VPS主机,本月商家针对韩国首尔、美国洛杉矶CUVIP-AS29、GIA回程带防御等多条线路VPS提供6-8.5折优惠码,优惠后韩国首尔CN2混合BGP特惠型/美国洛杉矶GIA回程带10Gbps攻击防御VPS主机最低每月14.4元起。下面列出几款不同机房VPS主机配置信息,请留意不同优惠码。...

星梦云60元夏日促销,四川100G高防4H4G10M,西南高防月付特价

星梦云怎么样?星梦云好不好,资质齐全,IDC/ISP均有,从星梦云这边租的服务器均可以备案,属于一手资源,高防机柜、大带宽、高防IP业务,一手整C IP段,四川电信,星梦云专注四川高防服务器,成都服务器,雅安服务器 。官方网站:点击访问星梦云官网活动方案:1、成都电信年中活动机(封锁UDP,不可解封):机房CPU内存硬盘带宽IP防护流量原价活动价开通方式成都电信优化线路4vCPU4G40G+50...

c xml为你推荐
qq讨论组怎样进QQ讨论组邮箱怎么写工作邮箱怎么填简体翻译成繁体简体字怎么换成繁体。。?人人时光机求 《小叮当》的日语歌词。最好有片假名的网站运营网络运营具体做什么呢今日热点怎么删除“今日热点”到底要怎样才能取消弹窗,每次开机都会安卓应用平台安卓手机下软件哪个网站好畅想中国用“心系祖国情,畅想中国梦”为题目的800字作文mate8价格手机华为mat8售价多少ios系统ios是什么意思 ios系统是什么
域名抢注工具 openv 便宜域名 parseerror 全站静态化 合租空间 万网主机管理 重庆电信服务器托管 数据库空间 国外的代理服务器 创速 阿里云邮箱个人版 windowsserver2008 register.com winds 什么是dns asp简介 免费php空间申请 ddos攻击 主机之家 更多