博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中按模板操作Word —— 如何向Word中插入图片
阅读量:6826 次
发布时间:2019-06-26

本文共 2532 字,大约阅读时间需要 8 分钟。

一、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位置:
获取本文源代码方法:
git checkout L06

转载地址:http://lwrzl.baihongyu.com/

你可能感兴趣的文章
Sencha touch实践(1)在ios,android上变web app为native app
查看>>
XNA游戏:重力感应
查看>>
DNS服务部署的那点事儿
查看>>
【云计算的1024种玩法】使用 MSMTP 实现底层环境的 阿里云·邮件推送服务 兼容...
查看>>
Varnish介绍,安装与配置详解。
查看>>
CentOS bash漏洞威胁恐比“心脏流血”更大
查看>>
LINUX总结
查看>>
SCOM 2016监控IIS 网页服务
查看>>
通用权限管理系统组件 (GPM - General Permissions Manager) 中最简单的例子程序,如何时间通讯录管理...
查看>>
Ajax
查看>>
端口基础常识大全贴
查看>>
Cisco交换机的经典配置(2)
查看>>
稳扎稳打Silverlight(24) - 2.0通信之Socket, 开发一个多人聊天室
查看>>
毕业论文一次性修改所有字母和数字的字体
查看>>
vsphere5.2.安装部署VMware ESXi 5 上 视频共享
查看>>
impala1.2.3 udf问题
查看>>
数据仓库专题23-原则!原则!原则!
查看>>
细节决定成败2: 链路负载均衡遇到IPS
查看>>
LigerUI中通过加载服务端数据进行表格的分页显示
查看>>
Hyper-V 2016 系列教程40 使用 PowerShell 实现虚拟机自动化和管理虚拟机
查看>>