C#中按模板操作Word —— 如何向Word中插入图片
一、Word对象模型的重叠性分析
本文主要介绍通过书签Bookmark向Word文档中插入图片的方法。在此之前我们先简单讨论下Word对象模型的重叠性。如果你对Word对象模型还不熟悉,请参考本专栏第一篇博文。相信你通过前几篇文章也有了解到,Word中五种对象:Applicatin、Document、Selection、Range和Bookmark似乎是重叠在一起的,什么意思呢?
比如说我们可以通过Applicatin.Documents属性的Add接口获取到Documents对象:
|
1
2
|
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();Document doc= Document doc = app.Documents.Add("D:\\Test.docx"); |
而通过Document的Applicatin属性我们又可以反过来获取到Applicatin对象。
|
1
|
Application app=doc.Application; |
我们可以通过Bookmark对象获取到Range对象:
|
1
2
3
4
|
foreach (Bookmark bk in doc.Bookmarks){ Range range = bk.Range; } |
也可以通过Range对象获取到Bookmark:
|
1
2
3
|
foreach (Bookmark bk in range.Bookmarks){ } |
几乎每种模型对象和其他兑现之间都存在这种复杂的包含关系。其实这种包含关系从下面这幅word模型图中便可看出端倪。

(1) Application 作为整个模型树的树根,在内存中又是单例的,所以可以通过其他四种对象中任意一种来获取到。
(2) Document和Selection是Application 的直接关联,可以通过Application 来获取Document和Selection对象。
(3) 而Bookmarks、Document、Range作为Selection的直接关联,也可以通过 Selection对象来获取到。
(4) 以此类推,这种获取的规律就是:参照这颗模型树,每个上级对象都能获取其直接下级对象。而反过来,每个下级对象也几乎可以获取其直接上级对象。但是Selection比较特殊。
(5) Selection对象只能通过Application 对象来获取,通过其他任何对象都无法获取到。
关于第5点,通过Selection的实际意义我们可以解释清楚。
Selection表示处于鼠标进行选中状态的内容范围,如果鼠标没有选中,它表示目前鼠标所在的位置,对于整个App来说它也是唯一的。以Range来举例来说明这个问题:
我们知道Range对象在文档中也是可以多个出现的,也就是说一个app中会包含很多个Range对象,这些Range对象可能在Selection的范围内,也可能没在Selection的范围内。而对于没在Selection范围内的Range,它是无从知道目前Selection的位置的,所以不能从Range反向得到Selection也算合理。对于Bookmarks和Document也是类似,这就是无法从上述三种对象得到Selection对象的原因。
二、利用Selection对象插入图片。
OK,介绍完了Word模型对象的重叠属性,我们进入正题,来讲解下在word中怎么插入图片。插入图片时我们需要用到Selection的一个属性InlineShapes,这也是为什么我们在开篇引出Selection获取方法的原因。想要获取Selection,必须先获取Application
对象。
下面,我将演示通过Bookmark插入图片的方法。
2.1 编写word模板
首先,我们编写一个word模板,并插入好书签:

在name书签里我们需要填写自己的姓名,然后在picture书签里,我们要插入头像。
2.2 加载模板文件
加载模板文件和上一节的方法相同,这里不再赘述,请直接参考下面的代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
private void button1_Click(object sender, EventArgs e){Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();Document doc = app.Documents.Add("D:\\Test.docx");app=doc.Application;doc.ActiveWindow.Visible = true;foreach (Bookmark bk in doc.Bookmarks){if (bk.Name == "name"){bk.Range.Text = "Hyman";}else if (bk.Name == "picture"){bk.Select();Selection sel = app.Selection;sel.InlineShapes.AddPicture("D:\\Test.jpg");}}doc.SaveAs("E:\\Test.docx");app.Quit();} |
这里唯一需要解释下的是下面这两句:
|
1
2
|
bk.Select();Selection sel = app.Selection; |
bk.Select();作用是把鼠标焦点定位到当前的书签出,然后通过app.Selection获取该焦点的位置。程序执行完成后生成的word文档内容如下,我们成功的把图片插入进去:

Github位置:
https://github.com/HymanLiuTS/OfficeTestByC-
获取本文源代码方法:
git checkout L06
C#中按模板操作Word —— 如何向Word中插入图片的更多相关文章
- jQuery 中使用 DOM 操作节点,对页面中的表格实现增、删、查、改操作
查看本章节 查看作业目录 需求说明: 在 jQuery 中使用 DOM 操作节点,对页面中的表格实现增.删.查.改操作 点击"增加"超链接时,将表格中的第一条数据添加到表格的末尾 ...
- C#操作Word,写数据,插入图片
本篇介绍的是如何在C#中往word里面写入数据. 如何在线的操作文档: c#在线操作文档 关于Aspose.Word控件的介绍,请戳→ 介绍 首先需要去下载这个dll文件,然后引用到你的项目当中.地 ...
- C# 操作Word书签(二)——插入图片、表格到书签;读取、替换书签
概要 书签的设置可以帮助我们快速的定位某段文字,使用起来很方便,也很节省时间.在前一篇文章“C# 如何添加/删除Word书签”中介绍了插入.删除书签的方法,本篇文章将对C# 操作Word书签的功能做进 ...
- Angular 中的 dom 操作(ViewChild)以及父子组件中通过 ViewChild 调用子组件的方法
<app-header #header></app-header> <div #myBox> 我是一个dom节点 </div> <button ( ...
- 学习篇:NodeJS中的模板引擎:jade
NodeJS 模板引擎作用:生成页面 在node常用的模板引擎一般是 1.jade --破坏式的.侵入式.强依赖(对原有的html体系不友好,走自己的一套体系)2.ejs --温和的.非侵入式的.弱依 ...
- 【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】
一.JQuery中样式的操作 1.给id=mover的div采用属性增加样式.one $("#b1").click(function(){ $("#mover" ...
- python中的赋值操作和复制操作
之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...
- SqlServer中的merge操作(转载)
SqlServer中的merge操作(转载) 今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有 ...
- 进入wordpress中的模板文件
Wordpress的页面结构 一个简单的wordpress由 头部.内容.页脚组成,每个块中的每一个都由当前wordpress主题中模板文件生成. eg: 头:包含重要的信息,一般都是网页的头部. 内 ...
随机推荐
- (转)Python黑魔法 --- 异步IO( asyncio) 协程
转自:http://www.jianshu.com/p/b5e347b3a17c?from=timeline Python黑魔法 --- 异步IO( asyncio) 协程 作者 人世间 关注 201 ...
- linux下配置某程序的sudo不用输密码
$ su密码: # cd /etc/# cp sudoers sudoers_bak# vi sudoers 最下面加入一行:ALL ALL = NOPASSWD:/usr/sbin/openconn ...
- asp.net上传大文件-请求筛选模块被配置为拒绝超过请求内容长度的请求
HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...
- 使用TCP协议的NAT穿透技术(转)
其实很早我就已经实现了使用TCP协议穿透NAT了,但是苦于一直没有时间,所以没有写出来,现在终于放假有一点空闲,于是写出来共享之. 一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技术,基 ...
- RestTemplate 发送 get 请求使用误区 多值为null
http://blog.csdn.net/zhousenshan/article/details/71055687 ****************************************** ...
- tf.placeholder
tf.placeholder placeholder( dtype, shape=None, name=None ) 功能说明: 是一种占位符,在执行时候需要为其提供数据 参数列表: 参数名 必选 类 ...
- nginx动态配置及服务发现那些事
Reference: http://xiaorui.cc/2016/10/16/nginx%E5%8A%A8%E6%80%81%E9%85%8D%E7%BD%AE%E5%8F%8A%E6%9C%8D% ...
- 消息队列RabbitMQ基础知识详解
一: 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序或者模块对模块的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另 ...
- Redis (1) —— 安装
Redis (1) -- 安装 摘要 介绍Mac OS X安装Redis基本方法 版本 Redis版本: 2.8.24 内容 下载Redis包 地址:http://download.redis.io/ ...
- linux rsync介绍(八)
[教程主题]:rsync [1] rsync介绍 Rsync(Remote Synchronize) 是一个远程资料同步工具,可通过LAN/WAN快速同步多台主机,Rsync使用所为的“Rsync演算 ...