vsto 功能区xml 中word自定义功能区的控件怎么操作

版权信息/VSTO开发者指南
  作者:(美国)Kathleen McGrath (美国)Paul Stubbs 译者:
  出版社:
  页码:400 页
  出版日期:2009年
  ISBN:9
  装帧:平装
  开本:16
  丛书名:华章
  市场价:59.00
内容简介/VSTO开发者指南
  《开发者指南》是为有兴趣把到下一代Office开发的VBA开发者写的。你可以得到编写Word 2003、Excel 2003和Outlook 2003托管代码程序的易懂且实用的介绍,还将学到如何用VSTO 2005 SE为最受欢迎的Office 2003和应用程序创建插件。
  作为这方面的专家,作者通过丰富的代码示例来展示受欢迎的VSTO功能,例如智能标记和操作窗格。示例代码也向你演示了如何定制Microsoft Office 2007新的uI功能,包括功能区、自定义任务窗格和Outlook窗体区域。
作者简介/VSTO开发者指南
  Kathleen McGrath在Microsoft做编程作家。她为Visual Studio 2005 Tools for the Microsoft Office System(VSTO)、Visual Studio Tools for Applications(VSTA)和Visual Basic写过文档。在加入Microsoft之前,她是一个VBA开发者,为金融印刷及法律行业定制Word应用程序。Kathleen还创建了短录像,示范VSTO和Visual Basic的功能,这些录像放在她的博客上:/kathleen。
  Paul Stubbs在Microsoft的Visual Studio Tools for Office(VSTO)组做程序经理。除了VSTO,Paul还和VSTA组合作为 2007和独立软件供应商(ISV)开发新的托管代码应用程序的可编程开发工具。Paul为MSDN Magazine写过文章,也在诸如和TechReady的活动上演讲过。
媒体推荐/VSTO开发者指南
  “真希望第一次接触VSTO和.NET Framework时就拥有这本书。它对于那些考虑VSTO以及从Office VBA转到的人都是极具价值的。广泛涉猎的主题为MSDN和其他地方的更加深入的面向开发者的文档提供了一个切入点。”
  —Cindy Meister,MS Word MVP
  “《VSTO入门经典》做了一件很好的事,在VBA和VSTO这两个世界之间架起了一座桥。Kathleen和Paul告诉我们,VBA开发者如何在拥有丰富的Office知识的同时也能获得Visual Studio的强大、可维护性和安全性。他们成功地写了一本容易接受、易于理解和令人信服的书。”
  —KD Hallman,总经理,Microsoft,Developer Division
  “对于想要转到使用Visual Studio Tools for Office为Office进行.NET开发的VBA开发者,这本书是一个不错的选择。很多示例都展示了VB.NET代码和对应的VBA代码,帮助解释关键概念和用法的区别。”
  —Steve Hansen,,
编辑推荐/VSTO开发者指南
  VBA开发者将会轻松获得:
  对托管代码和Visual Studio集成开发环境(IDE)的深入理解。
  多个如何使用视图控件、数据绑定和操作窗格为Word 2003和Excel 2003创建文档级别的定制程序的示例。
  为Outlook 2003开发插件的全面概览。
  用VSTO和VSTO 2005 SE创建的解决方案在安全和部署方面的有用信息。
  如何把VBA解决方案迁移到Visual Basic 2005和VSTO的详细说明。
  更多关于Microsoft Office 2007开发VSTO 2005 SE插件定制
  功能区、自定义任务窗格和Outlook窗体区域的详细信息。
目录/VSTO开发者指南
  对《VSTO入门经典》的赞誉 1
  译者序 2
  译者简介 3
  前言 5
  介绍 5
  致谢 8
  作者简介 9
  目录 9
  第一部分 VSTO介绍 23
  第1章 VSTO入门 23
  1.1 本章涉及的主题 23
  1.2 什么是VSTO? 23
  1.3 为什么用VSTO代替VBA? 24
  1.4 VSTO的功能 25
  1.4.1 宿主项和宿主控件 26
  1.4.2 Windows Forms控件 27
  1.4.3 智能标记 28
  1.4.4 定制任务窗格 28
  1.4.5 在文档中缓存数据 29
  1.4.6 托管插件 29
  1.4.7 安全和部署 29
  1.4.8 功能区支持 30
  1.4.9 增强开发环境 30
  1.5 创建VSTO解决方案 30
  1.5.1 用VBA创建Office解决方案 30
  1.5.2 用VSTO创建Office解决方案 31
  1.5.3 项目类型 32
  1.6 VSTO如何与Visual Studio集成 34
  1.6.1 把Word和Excel当作设计器来用 34
  1.6.2 VSTO中的代码文件 35
  1.7 摘要 35
  1.8 复习问题 36
  第2章 编程环境 36
  2.1 本章涉及的话题 36
  2.2 Visual Studio IDE介绍 36
  2.2.1 环境设置 37
  2.2.2 创建Visual Studio Tools for Office项目 37
  2.2.3 准予访问VBA项目系统 38
  2.2.4 菜单和工具栏 38
  2.3 查看IDE窗口 39
  2.3.2 探究Solution Explorer 40
  2.3.3 Properties窗口 44
  2.3.4 浏览Object Browser 45
  2.3.5 项目属性 46
  2.3.6 查看其他Visual Studio窗口 47
  2.4.1 使用智能感知 48
  2.4.2 编辑并继续 52
  2.5 构建和运行代码 52
  2.6 调试你的代码 53
  2.6.1 设置断点 55
  2.6.2 逐语句、逐过程和跳出代码 56
  2.6.3 试用调试工具 58
  2.6.4 使用调试窗口 60
  2.7 查找和使用帮助 63
  2.7.1 目录 63
  2.7.2 索引 64
  2.7.3 搜索 64
  2.7.4 如何实现 64
  2.7.5 动态帮助 65
  2.8 摘要 65
  2.9 复习问题 65
  第3章 托管代码介绍 66
  3.1本章涉及的话题 66
  3.2 什么是托管代码? 66
  3.3 面向对象编程介绍 67
  3.3.1 理解类和对象 67
  3.3.4 接口 73
  3.3.5 面向对象概念 74
  3.4 探究 .NET Framework 75
  3.4.1 程序集 75
  3.4.2 命名空间 76
  3.4.3 应用程 77
  3.4.4 公共语言运行库 77
  3.4.6 .NET Framework类库 79
  3.5 VSTO和托管代码 82
  3.5.1 主互操作程序集 82
  3.5.2 解决方案程序集 83
  3.5.3 运行VSTO解决方案 84
  3.6摘要 85
  3.7复习问题 85
  第4章 从VBA转到VSTO和Visual Basic 2005 85
  4.1本章涉及的话题 85
  4.2转到Visual Studio 2005 85
  4.3 Visual Basic 2005的新功能 86
  4.3.1 My对象 86
  4.3.2智能感知代码段 88
  4.3.3语句 89
  4.3.4运算符 90
  4.4 VBA和Visual Basic 2005在语言上的差别 91
  4.4.1数据类型 91
  4.4.2 方法 94
  4.4.3 变量的声明和作用域 94
  4.4.4 默认属性 95
  4.4.5 枚举 96
  4.4.6 异常处理 96
  4.5 UserForm对Windows Forms 97
  4.5.1 比较ActiveX控件和Windows Forms控件 98
  4.5.2 控件功能的改变 103
  4.6 摘要 106
  4.7 复习问题 106
  第二部分 Word和Excel 106
  第5章 定制Word和Excel任务窗格 106
  5.1 本章涉及的话题 107
  5.2 什么是任务窗格? 107
  5.3 定制Document Actions任务窗格 108
  5.4 管理操作窗格 109
  5.4.1 管理操作窗格的大小和位置 109
  5.4.2 显示和隐藏操作窗格 110
  5.5 设计操作窗格解决方案 110
  5.5.1 创建操作窗格解决方案 111
  5.5.2 添加操作窗格控件 112
  5.5.3 从文档访问操作窗格 112
  5.5.4 从操作窗格访问文档 113
  5.5.5 管理控件顺序 114
  5.6 创建上下文相关的解决方案 115
  5.6.1 创建XML架构 115
  5.6.2 映射XML元素到你的文档 116
  5.6.3 创建多个操作窗格控件 117
  5.6.4 显示和隐藏操作窗格上的控件 117
  5.6.5 向操作窗格控件添加功能 118
  5.7 摘要 119
  5.8 复习问题 119
  第6章 使用VSTO定制Word 119
  6.1 本章涉及的话题 119
  6.2 对Word进行编程 120
  6.2.1把录制的VBA宏转换成VSTO里的Visual Basic 121
  6.2.2重写内置命令 122
  6.3 Word宿主项和宿主控件 124
  6.3.1向文档添加宿主控件 124
  6.3.2从基础的互操作对象访问宿主控件 128
  6.3.3从宿主控件访问互操作对象 129
  6.4 对文档上的宿主控件进行数据绑定 129
  6.4.1把数据绑定到控件 130
  6.4.2在文档里缓存数据 132
  6.5 对事件进行编程 132
  6.5.1 Bookmark控件的事件 133
  6.5.2 XMLNode控件的事件 138
  6.5.3 XMLNodes控件的事件 140
  6.5.4 Document的事件 140
  6.6 对Bookmark的特别强化 145
  6.7 使Word文档智能化 146
  6.8 摘要 147
  6.9 复习问题 147
  第7章 使用VSTO定制Excel 148
  7.1 本章涉及的话题 148
  7.2 对Excel进行编程 148
  7.2.1了解Excel对象模型 150
  7.2.2把录制的VBA宏转换成VSTO里的Visual Basic 150
  7.2.3写回调从VBA访问VSTO代码 151
  7.3 Excel宿主项和宿主控件 153
  7.3.1宿主项 153
  7.3.2宿主控件 153
  7.3.3向工作表添加宿主控件 154
  7.3.4移除宿主控件 157
  7.3.5在运行时添加宿主控件 157
  7.3.6控件持久化 159
  7.3.7从基础的互操作对象访问宿主控件 160
  7.3.8从宿主控件访问互操作对象 160
  7.3.9在Excel里添加宿主项 161
  7.3.10 Excel的区域设置问题 161
  7.4 对工作表上的宿主控件进行数据绑定 162
  7.4.1创建数据源 162
  7.4.2向工作表添加数据绑定控件 163
  7.4.3使用关联数据 166
  7.4.4在工作簿里缓存数据 166
  7.5 对事件进行编程 167
  7.5.1 NamedRange控件事件 167
  7.5.2 ListObject控件事件 169
  7.5.3 XMLMappedRange控件事件 172
  7.5.4 Chart控件事件 173
  7.5.5工作表事件 175
  7.5.6图表工作表事件 177
  7.5.7工作簿事件 177
  7.6 使Excel更智能 180
  7.7 摘要 181
  7.8 复习问题 181
  第8章 Word和Excel里的控件 181
  8.1 本章涉及的话题 182
  8.2 关于控件 182
  8.3 向工具栏和菜单添加控件 182
  8.3.1创建工具栏按钮 182
  8.3.2创建菜单和菜单项 185
  8.4 使用Windows Forms控件 186
  8.5 向Windows Forms添加控件 193
  8.6 向任务窗格添加控件 196
  8.7 向Excel和Word文档添加控件 197
  8.7.1 Word里的Windows Forms控件 198
  8.7.2 Excel里的Windows Forms控件 199
  8.7.3 添加数据绑定控件 200
  8.7.4 向文档添加自定义控件 202
  8.7.5 控件类型 203
  8.7.6 在运行时添加控件 204
  8.7.7 文档上的Windows Forms控件的功能 207
  8.8 摘要 208
  8.9 复习问题 208
  第9章 Word和Excel里的智能标记 208
  9.1 本章涉及的话题 209
  9.2 什么是智能标记? 209
  9.3 用VSTO创建Word和Excel智能标记 210
  9.4 理解智能标记的属性 212
  9.4.1 Actions属性 212
  9.4.2 Caption属性 212
  9.4.3 Expressions属性 213
  9.4.4 SmartTagType属性 213
  9.4.5 Terms属性 213
  9.5 在智能标记上执行操作 213
  9.6 正则表达式介绍 215
  9.6.1 使用正则表达式识别词组 215
  9.6.2 识别文字模式 216
  9.7 重写智能标记识别器 219
  9.7.1 创建Word项目 220
  9.7.2 运行代码 220
  9.7.3 进入离线状态 221
  9.8 摘要 222
  9.9 复习问题 222
  第三部分 Outlook和其他 222
  第10章 使用VSTO为Outlook创建插件 222
  10.1 本章涉及的话题 223
  10.2 使用VSTO的应用程序级别的定制程序 223
  10.2.1共享插件和VSTO插件之间的区别 224
  10.2.2 Outlook插件项目模板 225
  10.2.3把Outlook宏转换成VSTO插件 226
  10.2.4创建一个简单的插件 227
  10.2.5 Visual Studio里的智能感知 228
  10.3 Outlook对象模型概述 229
  10.3.1 Application对象 230
  10.3.2 NameSpace对象 230
  10.3.3 Explorer对象 230
  10.3.4 Inspector对象 231
  10.3.5 Outlook文件夹 231
  10.3.6 Outlook项 232
  10.3.7事件 233
  10.4 定制Outlook里的菜单和工具栏 233
  10.5 调试插件 234
  10.6 使用VSTO创建的Outlook插件的安全性 237
  10.7 摘要 240
  10.8 复习问题 240
  第11章 安全性和部署 240
  11.1 本章涉及的话题 240
  11.2 VSTO安全模型 240
  11.3 部署Word和Excel解决方案 243
  11.3.1客户端要求 243
  11.3.2 Microsoft PSS VSTO 2005 Client
  11.3.3部署模型 244
  11.3.4应用程序和部署清单 245
  11.3.5部署任务 246
  11.3.6 Public Wizard 246
  11.3.7更新和回滚 250
  11.3.8 Microsoft Installer项目 251
  11.4 部署Outlook解决方案 253
  11.5 摘要 253
  11.6 复习问题 253
  第12章 把VBA解决方案迁移到VSTO 254
  12.1 本章涉及的话题 254
  12.2 迁移概述 254
  12.3 迁移策略 254
  12.4 一个项目的简单迁移 255
  12.5 一个Word VBA项目的高级迁移 256
  12.5.1复制 256
  12.5.2从模板移除VBA代码和UserForm 257
  12.5.3创建Windows窗体 257
  12.5.4启动Windows窗体 258
  12.5.5运行解决方案 258
  12.5.6重新设计解决方案 258
  12.5.7 Bookmark视图控件 259
  12.5.8使用操作窗格 259
  12.6 VBA和VSTO的互操作 260
  12.7 摘要 262
  12.8 复习问题 263
  第13章 VSTO的高级话题 263
  13.1 本章涉及的话题 263
  13.2 ServerDocument概述 263
  13.3 附加和分离基于文档的定制程序 264
  13.2.1使用ServerDocument从文档分离解决方案 264
  13.2.2使用ServerDocument向文档附加解决方案 264
  13.2.3使用自定义文档属性向文档附加解决方案 265
  13.4 读写数据缓存 265
  13.4.1缓存数据结构 265
  13.4.2创建一个有缓存数据的测试文档 266
  13.4.3读取文档数据缓存 267
  13.4.4运行解决方案 269
  13.5 清除数据缓存 269
  13.6 摘要 270
  13.7 复习问题 270
  第14章 VSTO 2005 SE和2007 Microsoft Office System 270
  14.1 本章涉及的话题 270
  14.2 VSTO 2005 SE入门 271
  14.2.1所有发布版本里的功能 271
  14.2.2 VSTO 2005 SE的插件模型 273
  14.3 创建插件 275
  14.4 定制功能区 276
  14.4.1功能区项 276
  14.4.2和XML协同工作 278
  14.4.3定制内置的功能区 280
  14.4.4向功能区添加其他控件 282
  14.4.5快速访问工具栏 285
  14.4.6不受支持的功能区功能 286
  14.4.7 Outlook里的功能区 286
  14.5 创建自定义任务窗格 289
  14.5.1为PowerPoint创建插件 289
  14.5.2打开和关闭自定义任务窗格 290
  14.5.3管理多个Word文档上的任务窗格 291
  14.5.4把文档级别的定制程序转换成VSTO 2005 SE插件 292
  14.5.5显示多个任务窗格 293
  14.6 创建自定义窗体区域 294
  14.6.1创建Outlook窗体区域文件 294
  14.6.2创建新的窗体区域 294
  14.6.3保存窗体区域 295
  14.6.4创建VSTO 2005 SE Outlook插件项目 295
  14.6.5在你的项目里内嵌窗体区域 295
  14.6.6创建和注册窗体区域清单 296
  14.6.7创建窗体区域注册表文件 296
  14.6.8创建窗体区域启动类 296
  14.6.9 连接窗体区域控件 297
  14.6.10 连接窗体区域 298
  14.6.11运行项目 298
  14.7 摘要 298
  14.8 复习问题 299
  附录A 创建代码段 299
  A.1 导入代码段 300
  A.2 插入代码段 300
  A.3 使用Code Snippets Manager 301
  附录B 创建Inspector CommandBar 301
序言/VSTO开发者指南
  Visual Studio Tools for Office(VSTO)的目标受众是“专业开发者”。这个术语有多重含义,而我们听到的最受认可的定义是“通过写代码获取报酬的人”。换句话说,这是他的主业。他不是部门开发者,比如说,把写Excel宏作为他的的一部分的会计人员,或者定制Word来增加他的生产力的办公人员。相反,他是一个有兴趣把Microsoft Office作为开发平台的.NET开发者。
  我们相信传统的Office开发者也会对VSTO感兴趣。在加入Microsoft之前,我们俩都是VBA开发者,定制Office应用程序,并且我们非常有兴趣了解托管代码。在这方面,我们不认为我们是唯一的。有上百万VBA开发者,许多都有兴趣学习下一代Office开发。现在的VSTO图书和文档通常都不是为VBA开发者写的;它假设开发者熟悉Visual Studio、面向对象编程和.NET Framework。这就不难理解它把重点更多地放在VSTO的功能和如何使用笨重的Office对象模型。
  我们想为VBA开发者写一本书。虽然你可能不熟悉.NET编程,但你有一个重要的优势:Office对象模型的知识。作为一个Office开发者,你很可能非常熟悉Office应用程序,在操作Office对象模型方面也有丰富的经验。我们认为学习托管代码的最佳环境是你已经熟悉的地方:Office开发。
  VSTO把Office开发带到.NET的世界,和VBA相比,它有优点也有缺点。使用VSTO,你可以更好地定制Word、Excel和Outlook,比如说,创建自定义任务窗格、向文档添加智能标记和把文档上的对象绑定到数据源。使用VSTO 2005 SE,你可以为六个Office应用程序创建插件、定制新的2007 Microsoft Office System的功能区和创建应用程序级别的自定义任务窗格。
  我们有幸和为VSTO设计、编码、测试和写文档的人一起工作,并从他们那里学到了很多。我们得到了内部人士对VSTO的看法,我们希望以一种易懂和有趣的方式把这些信息传递给你。
书摘/VSTO开发者指南
  第一部分 VSTO概述
  第1章 VSTO入门
  1.4 VSTO的功能
  VSTO提供的编程模型扩展了Word和Excel里的一些公共对象,例如书签和范围。这些对象现在具备了数据绑定的能力。比如说,你可以把数据库里的字段绑定到Excel里的单元格。使用数据绑定,你可以让数据自动填充到文档的对应位置,并且根据用户的输入更新数据库里的数据。
  VSTO编程模型背后的理念是把数据及其表现形式分离开来。你现在可以直接访问存储在数据源里的数据,而不用在文档里查找显示这些数据的对象。数据源可以是数据库、XML文件,甚至是文本文件。
  数据绑定对于服务器端编程尤其有用。VSTO使你可以在文档里储存能被外部应用程序访问(无需打开该文档)的数据。若要做到这点,你可以通过把数据储存在XML或者数据缓存(data cache)里。如果你把数据储存在数据缓存里,那么你可以在服务器上访问数据缓存,而无需打开文档或者在服务器上安装Word或Excel。
  VSTO扩展对象的另一种做法是添加本地对象里没有的事件。比如说,你现在可以对工作表单元格的更改事件编程,而不用遍历对象模型并编写许多行代码找出哪个单元格发生了改变。当你在文档或者工作表上添加这些扩展对象时,VSTO把它们创建成一级·,NET对象,你可以直接对它们编程。这些对象称为宿主控件(host contr01),而你添加宿主控件的文档或者工作表则称为宿主项(host item)。
  使用VSTO 2005 SE,你可以为Office
Microsoft Office System创建应用程序级别的插件。VSTO 2005 SE还支持定制Office 2007的新用户界面,包括功能区、自定义任务窗格和Outlook窗体区域。
  1.4.1 宿主项和宿主控件
  正如前面所提到的那样,宿主项是一个表示Office对象模型人口点的类。默认情况下,当你创建1个Excel解决方案时,将会创建4个Excel的宿主项:Workbook、Sheetl、Sheet2和sheet3。如果你在设计时添加更多工作表,那些工作表将被创建为宿主项。宿主项通过添加数据绑定的能力和提供额外的事件来扩展本地Office文档。
  宿主项是word或者Excel的设计图面(design surface),担当控件容器的角色,这是看待宿主项的一个角度。就像你在VBA里把控件添加到UserForm上一样,你可以把Window Forms控件和宿主控件添加到宿主项上。这条规则的一个例外是工作簿宿主项。工作簿可以包含组件(component),但不能包含控件。
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:4次
参与编辑人数:4位
最近更新时间: 16:58:25
贡献光荣榜1452人阅读
12& 读写openxml
offic2007都是用openxml来构建,当我们在文档中插入一个图表,该图表的样式数据会已xml文件的形式保存在文件charts目录下。我们也可以自定义xml文件然后绑定到文档中。在服务器上程序只需求修改xml文件就可以改变文档中绑定的数据。
下面我们试验通过Package对象来取得docx文件中的xml文件。提示一下:对docx操作的代码不能直接写在该docx文档的工程中,否则系统会提示该文件已经被占用。
//构建Package对象,打开word文档
&&&&&&&&&&& Package package =
Package.Open(@&D:\Backup\我的文档\VisualStudio2008\Projects\WordDocument2\WordDocument2\bin\Debug\WordDocument2.docx&);
&&&&&&&&&& //用uri对象设置包内文件路径
&&&&&&&&&&& Uri documetUri =
newUri(&/word/charts/chart1.xml&,UriKind.Relative);
&&&&&&&&&& //取得包内文件
&&&&&&&&&&& PackagePartdocumanetPart = package.GetPart(documetUri);
&&&&&&&&&&& //声明一个xml对象
&&&&&&&&&&& XmlDocument documentXml =
newXmlDocument();
&&&&&&&&&&& //将包内文件装载如xml对象
&&&&&&&&&&&documentXml.Load(documanetPart.GetStream());
&&&&&&&&&&& //声明xml读取对象
&&&&&&&&&&& XmlNodeReader readerXml =
newXmlNodeReader(documentXml);
&&&&&&&&&&& while (readerXml.Read())//遍历xml文件
&&&&&&&&&&& {
&&&&&&&&&&&&&&& if (readerXml.NodeType ==
XmlNodeType.Element)//如果节点是一个元素。节点有元素和属性两个类型
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&& &//判断当前节点名是否是我们指定的。如果是就将它输出
&&&&&&&&&&&&&&&&&&&//if (xmlread.LocalName.Equals(&id&)|| xmlread.LocalName.Equals(&name&) ||xmlread.LocalName.Equals(&age&))
&&&&&&&&&&&&&&&&&&&//{
&&&&&&&&&&&&&&&&&&&&&&&&//读处节点名和节点数据
&&&&&&&&&&&&&&&&&&&&&&// Response.Write(xmlread.LocalName + &:& + xmlread.ReadString());
&&&&&&&&&&&&&&&&&&&//}
&&&&&&&&&&&&&&&&&&&//string str = readerXml.LocalName+&&&& :&&& & +readerXml.ReadString();
&&&&&&&&&&&&&&&&&&&//Console.WriteLine(str);
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& string str = readerXml.LocalName +
&&&& :&&& & + readerXml.ReadString();
&&&&&&&&&&&&&&& Console.WriteLine(str);
&&&&&&&&&&& }
&&&&&&&&&&& //关闭xml读取对象
&&&&&&&&&&& readerXml.Close();
另外一个openxml读写的例子
Openxml可以自定义用户数据包,一般在customXml\ item1.xml中。我们可以使用Content Control Toolkit工具生成用户数据xml,然后把用户xml绑定到word控件中。我们只需要修改用户xml就可以实现word数据的动态绑定了。
//构建Package对象,打开word文档
&&&&&&&&&&& Package package =
Package.Open(@&testXml.docx&);
&&&&&&&&&&& //用uri对象设置包内文件路径
&&&&&&&&&&& Uri documetUri =
newUri(&/customXml/item1.xml&,UriKind.Relative);
&&&&&&&&&&& //取得包内文件
&&&&&&&&&&& PackagePart documanetPart =package.GetPart(documetUri);&&&&&&&&&&
&&&&&&&&&&& //声明一个xml对象
&&&&&&&&&&& XmlDocument documentXml =
newXmlDocument();
&&&&&&&&&&& //将包内文件装载如xml对象
&&&&&&&&&&&documentXml.Load(documanetPart.GetStream());
&&&&&&&&&&& //声明xml读取对象
&&&&&&&&&&& XmlNodeReader readerXml =
newXmlNodeReader(documentXml);
&&&&&&&&&&& //指明要修改的xml节点
&&&&&&&&&&& XmlNodeList xmlNodeList = documentXml.SelectNodes(&/dataroot[1]/表1[1]/name[1]&);
&&&&&&&&&&& //修改节点内容
&&&&&&&&&&&xmlNodeList[0].InnerText =
&世界,你好,我会用xml了!!!&;
&&&&&&&&&&& //写回package
&&&&&&&&&&&documentXml.Save(documanetPart.GetStream(FileMode.Create,FileAccess.Write));
//收回资源
&&&&&&&&&&&readerXml.Close();
&&&&&&&&&&&package.Close();
&&&&&&&&&&& //打开word
&&&&&&&&&&& string WordPath =
@&testXml.docx&;
&&&&&&&&&&& Process.Start(&winword&,WordPath);
13 openxml工具PackageExplorer和Content Control Toolkit
1 ContentControl Toolkit它是微软公司的一个开源软件,通过它我们可以很方便的实现xml与文档的数据绑定。
首先我们在word中通过 开发工具\控件\Aa插入数据控件。然后打开Content ControlToolkit后,开源在左边工作区发现我们插入的数据控件,在右边我们可以看见word的xml结构。打开在edit view页标签可以对xml进行编辑,xml只有一个根目录,一次我们不能够直接增加节点,要把节点嵌入到根目录中。例如:我们增加一个节点
&b:SourcesSelectedStyle=&\APA.XSL& StyleName=&APA&xmlns:b=&http://schemas.openxmlformats.org/officeDocument/2006/bibliography&xmlns=&http://schemas.openxmlformats.org/officeDocument/2006/bibliography&&
&&& &test&tttt&/test&
&/b:Sources&
然后回到bind view页标签,我们就可以看到我们刚才增加的data目录和test节点。在这里我们就可以直接将test节点拖入工作区的数据控件上,自动实现绑定。
另外提一下,默认情况下,开发工具是关闭的。开发开发工具选项如何打开——在 左上角offic按钮\word选项\常用\在功能区显示开发工具选项。
手工建立用户xml很麻烦,我们可以将数据表导出成xml文件,然后在工具的editview页标签中通过XML an open按钮打开。这样我们就很方便的导入一个xml,但是该工具只能导入一个xml文件,如果我们有多个xml,我们需要自己手工合并成一个xml文件后,在导入到工具中。
2 使用PackageExplorer我们可以很方便的看见offic文档中的xml文件结构,但是注意该软件对中文支持不好,在其中修改xml时,切忌不要使用中文,offic文档打开否则会报错。
14 PackageHelper
这个类是微软公司提供的,该类主要目的是创建一个packag,然后构建其中的部件然后保存。相当于手动创建一个offic文档。如果我们只是需要打开一个创建好的offic文档不需要使用该类,使用上门的代码就可以了。
using System.Collections.G
using System.T
using System.IO.P
using System.IO;
using System.X
using System.Xml.XP
namespace OPENXML
&&& ///&summary&
&&& /// This class encapsulates the common functions performed
&&& /// when working with a package located in memory.
&&& ///&/summary&
&&& internalsealed
class PackageHelper :
IDisposable
&&&&&&& #region Private Fields
&&&&&&& privateMemoryStream m_packageD
&&&&&&& privatePackage m_
&&&&&&& #endregion
&&&&&&& #region Constructor
&&&&&&& ///&summary&
&&&&&&& /// Creates a new instance of a package basedc on the dataprovided.
&&&&&&& ///&/summary&
&&&&&&& ///&paramname=&data&&Byte arrayrepresenting the package.&/param&
&&&&&&& publicPackageHelper(byte[] data)
&&&&&&&&&&& //load the memory stream
&&&&&&&&&&& m_packageData = new
MemoryStream();
&&&&&&&&&&&m_packageData.Write(data, 0, data.Length);
&&&&&&&&&&& //open the package
&&&&&&&&&&& m_package =
&&&&&&&&&&&&&&& Package.Open(m_packageData,
&&&&&&&&&&&&&&&&&&& FileMode.Open,
&&&&&&&&&&&&&&&&&&& FileAccess.ReadWrite);
//use read write access
&&&&&&& #endregion
&&&&&&& #region Disposal Methods
&&&&&&& ///&summary&
&&&&&&& /// Close the package and the memory stream
&&&&&&& ///&/summary&
&&&&&&& publicvoid Dispose()
&&&&&&&&&&& m_package.Close();
&&&&&& &&&&&m_packageData.Close();
&&&&&&& #endregion
&&&&&&& #region Package Management Methods
&&&&&&& ///&summary&
&&&&&&& /// Saves the package data stored in the internal memorystream to a file.
&&&&&&& ///&/summary&
&&&&&&& ///&param name=&filename&&The filename to write the package to&/param&
&&&&&&& publicvoid Save(stringfilename)
&&&&&&&&&&& //flush and data in the package buffers to the stream
&&&&&&&&&&& m_package.Flush();
&&&&&&&&&&& m_package.Close();
&&&&&&&&&&& //write the stream to the output file
&&&&&&&&&&& using(FileStream outputStream =
File.Create(filename))
&&&&&&&&&&&&&&&m_packageData.WriteTo(outputStream);
&&&&&&&&&&& //close the stream
&&&&&&&&&&& m_packageData.Close();
&&&&&&& #endregion
&&&&&& &#region Part Management Methods
&&&&&&& ///&summary&
&&&&&&& /// Opens the part and loads the XML into an XmlDocument.
&&&&&&& ///&/summary&
&&&&&&& ///&paramname=&partUri&&The uri of thepart to open.&/param&
&&&&&&& ///&returns&XmlDocument containing the xml from the part.&/returns&
&&&&&&& publicXmlDocument GetWritablePart(Uri partUri)
&&&&&&&&&&& //get the part
&&&&&&&&&&& PackagePartwritablePart = m_package.GetPart(partUri);
&&&&&&&&&&& //load the part into a XmlDocument
&&&&&&&&& &&XmlDocumentpartXml =
new XmlDocument();
&&&&&&&&&&& using(Stream partStream =
&&&&&&&&&&&&&&&writablePart.GetStream(FileMode.Open,FileAccess.Read))
&&&&&&&&&&& {
&&&&&&&&&&&&&&&partXml.Load(partStream);
&&&&&&&&&&& }
&&&&&&&&&&& //return the document
&&&&&&&&&&& returnpartX
&&&&&&& ///&summary&
&&&&&&& /// Replaces all content in the part with the XML in theXmlDocument.
&&&&&&& ///&/summary&
&&&&&&& ///&paramname=&partUri&&The uri of thepart to replace.&/param&
&&&&&&& ///&paramname=&partXml&&XmlDocumentcontaining the xml to place into the part.&/param&
&&&&&&& publicvoid SavePart(UripartUri,
XmlDocument partXml)
&&&&&&&&&&& //get the part
&&&&&&&&&&& PackagePartwritablePart = m_package.GetPart(partUri);
&&&&& &&&&&&// load thepart into a XmlDocument
&&&&&&&&&&& using(Stream partStream =
&&&&&&&&&&&&&&&writablePart.GetStream(FileMode.Open,FileAccess.Write))
&&&&&&&&&&& {
&&&&&&&&&&&&&&&partStream.SetLength(0);
&&&&&&&&&&&&&&&partXml.Save(partStream);
&&&& &&&&&&&}
&&&&&&& #endregion
15 使用解压缩方式来修改openxml文件
直接通过packag方式,我们很难得到word文件中
\word\embeddings\ Microsoft_Office_Excel____1.xlsx的excle文件。该文件是word中图表chart对象和excle对象的数据源,我们只需要修改它就可以达到修改word中excle和chart对象的目的。
1 我们先来通过解压缩的方式修改客户xml文件
首先要导入ICSharpCode.SharpZipLib.dll
//xml文件的地址
&&&&&&&&&&& stringxmlPath =
@&testXml1\customXml\item1.xml&;
&&&&&&&&&&& //声明一个xml对象
&&&&&&&&&&& XmlDocumentdocumentXml =
new XmlDocument();
&&&&&&&&&&& //将包内文件装载如xml对象
&&&&&&&&&&&documentXml.Load(xmlPath);
&&&&&& &&&&&//声明xml读取对象
&&&&&&&&&&& XmlNodeReaderreaderXml =
new XmlNodeReader(documentXml);
&&&&&&&&&&& //指明要修改的xml节点
&&&&&&&&&&& XmlNodeListxmlNodeList = documentXml.SelectNodes(&/dataroot[1]/表1[1]/name[1]&);
&&&&&&&&&&& //修改节点内容
&&&&&&&&&&& xmlNodeList[0].InnerText=
&offic2007都是用openxml来构建&;
&&&&&&&&&& //保存xml文件
&&&&&&&&&&&documentXml.Save(xmlPath);
//收回资源
&&&&&&&&&&& readerXml.Close();
&&&&&&&&&&& package.Close();
&&&&&&&&&&& //删除目标位置上的docx文件,为新建文件腾出位置。&&&&&&&&&&&
&&&&&&&&&&& File.Delete(&t.docx&);
&&&&& &&&&&&//声明zip对象,
&&&&&&&&&&& FastZipfz =
new FastZip();
&&&&&&&&&&& //创建压缩文件,指定输出文件地址和文件名,压缩目录地址。
&&&&&&&&&&& fz.CreateZip(&t.docx&,
&testXml1&,true,
&&&&&&&&&&& //打开文档
&&&&&&&&&&& Process.Start(&winword&,
&t.docx&);
16 读写excle(用Schema定位xml节点,修改后保存)
读写excle数据源的难点在于如何定位,1首先声明excle的Schema,用它来构建数据的路径。然后使用SelectSingleNode方法把数据节点提取出来
static void ZIPexcle()
&&&&&&&&&&&
&&&&&&&&&&& //构建Package对象,打开word文档
&&&&&&&&&&& string fileName =
@&test1.xlsx&;&&&&&&&&&&&
&&&&&&&&&&& Package package =
Package.Open(fileName);&&&&&&&&&&&
&&&&&&&&&&& Uri documetUri =
newUri(&/xl/worksheets/sheet1.xml&,UriKind.Relative);&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&& PackagePart documanetPart =package.GetPart(documetUri);
&&&&&&&&&&&
&&&&&&&&&&& //声明一个xml对象
&&&&&&&&&&& XmlDocument documentXml =
newXmlDocument();
&&&&&&&&&&&&documentXml.Load(documanetPart.GetStream());
&&&&&&&&&&&&setXml(documentXml,&B1&,&101&);//修改xml节点值
&&&&&&&&&&& //保存xml文件
&&&&&&&&&&&documentXml.Save(documanetPart.GetStream(FileMode.Create,FileAccess.Write));
&&&&&&&&&&&package.Close();
&&&&&&& //修改xml节点值
&&&&&&& private
static void setXml(
XmlDocumentdocumentXml,string changAccess,string changValue)
&&&&&&&&&&& //构建excle的Schema
&&&&&&&&&&& const
string worksheetSchema= &http://schemas.openxmlformats.org/spreadsheetml/2006/main&;
&&&&&&&&&&& NameTable nt =
newNameTable();
&&&&&&&&&&& XmlNamespaceManager nsManager =
new XmlNamespaceManager(nt);
&&&&&&&&&&&nsManager.AddNamespace(&d&,worksheetSchema);
&&&&& &&&&&&//从xml中取出节点
&&&&&&&&&&& XmlNode cellNode = documentXml.SelectSingleNode(string.Format(&//d:sheetData/d:row/d:c[@r='{0}']&,changAccess), nsManager);
&&&&&&&&&&&cellNode[&v&].InnerText =changV//修改节点值
17 使用sqlserver导出xml,然后绑定到Content Control Toolkit中
我们很多文档都是要绑定当数据库中去,因此我们需要将数据库中的表导出成xml格式文件然后通过Content Control Toolkit导入,最后绑定到文档标签中。
1 、sqlserver导出xml
很多版本的sqlser2005不支持导出功能,那么我们可以通过语句实现导出。
FROM [t1] for xml
auto ,ELEMENTS
2 、导入到Content Control Toolkit中
导入Content Control Toolkit后就会自动插入到用户xml文件中,但是我们需要注意用户xml只能有一个根节点,但是从sqlserver导出的xml结构中没有根节点。因此我们需要手工添加一个根节点。
18 VSTO和openxml中读写table
1 在VSTO中打开table
如果在VSTO程序中可以直接用这个代码吧table打开
this.Tables[1].Rows[1].Cells[1].Range.Text=&great&;
如果在其他工程中需要打开word中得tabl可以用下面的代码
string paTh =
Environment.CurrentD
&&&&&&&&&&& string filePath = paTh+@&\test.docx&;
&&&&&&&&&&& object missing =
&&&&&&&&&&& object[] filename =
newobject[1] { filePath };
&&&&&&&&&&& try
&&&&&&&&&&& {
&&&&&&&&&&&&&&&Microsoft.Office.Interop.Word.ApplicationwordApp =
new Microsoft.Office.Interop.Word.Application();
&&&&&&&&&&&&&&& Document wordDoc = wordApp.Documents.Open(ref filename[0],
refmissing, ref missing,
refmissing, ref missing,
refmissing, ref missing,
refmissing, ref missing,
refmissing, ref missing,
refmissing, ref missing,
refmissing, ref missing,
refmissing);
&&&&&&&&&&&&&&& string str =wordDoc.Tables[1].Rows[1].Cells[1].Range.T
&&&&&&&&&&&&&&&wordDoc.Tables[1].Rows[1].Cells[1].Range.Text=&test&;
&&&&&&&&&&&&&&& object[] options =
newobject[1] {
&&&&&&&&&&&&&&&wordDoc.Save();
&&&&&&&&&&&&&&&wordDoc.Close(ref options[0],
ref missing, refmissing);
&&&&&&&&&&& }
&&&&&&&&&&& catch (Exceptionex)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& //MessageBox.Show(ex.Message);
&&&&&& &&&&&&&&&//
&&&&&&&&&&& }
2 在openxml中打开table
使用openxml的Documents方法来操作表格非常麻烦。还是使用VSTO得对象来得方便。
using (WordprocessingDocument doc =
WordprocessingDocument.Open(
&&&&&&&&&&&&&&& @&G:\测试\OPENXML\INSER_TTABLE\bin\Debug\test.docx&,false))
&&&&& &&&&&&{
&&&&&&&&&&&&&&& //取出第一個Table
&&&&&&&&&&&&&&&DocumentFormat.OpenXml.Wordprocessing.Tabletbl = doc.MainDocumentPart.Document.Body
&&&&&&&&&&&&&&&&&&&.Elements&DocumentFormat.OpenXml.Wordprocessing.Table&().First();
&&&&&&&&&&&&&&
&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& //取得TableRow陣列
&&&&&&&&&&&&&&& var rows = tbl.Elements&TableRow&().ToArray();&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& for (int i = 0; i& rows.L i++)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&//取得TableRow的TableCell陣列
&&&&&&&&&&&&&&&&&&&var cells = rows[i].Elements&TableCell&()
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .ToArray();
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&//顯示每列的內容
&&&&&&&&&&&&&&&&&&&for (intj = 0; j & cells.L j++)
&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&Console.WriteLine(&Row:{0} Cell:{1} Value={2}&,
&&&&&&&&&&&&&&&&&&&&&&&&&&& i, j,
&&&&&&&&&&&&&&&&&&&&&&&&&&&cells[j].Elements&DocumentFormat.OpenXml.Wordprocessing.Paragraph&().First().InnerText);
&&&&&&&&&&&&&&&&&&&&&&//cells[j].Elements&DocumentFormat.OpenXml.Wordprocessing.Paragraph&().First().InnerText= &king&;
&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& Console.Read();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25661次
排名:千里之外
原创:17篇
(1)(3)(6)(1)(1)(1)(1)(2)(1)(5)}

我要回帖

更多关于 word自定义功能区 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信