一、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中插入图片的更多相关文章

  1. jQuery 中使用 DOM 操作节点,对页面中的表格实现增、删、查、改操作

    查看本章节 查看作业目录 需求说明: 在 jQuery 中使用 DOM 操作节点,对页面中的表格实现增.删.查.改操作 点击"增加"超链接时,将表格中的第一条数据添加到表格的末尾 ...

  2. C#操作Word,写数据,插入图片

    本篇介绍的是如何在C#中往word里面写入数据. 如何在线的操作文档:  c#在线操作文档 关于Aspose.Word控件的介绍,请戳→ 介绍 首先需要去下载这个dll文件,然后引用到你的项目当中.地 ...

  3. C# 操作Word书签(二)——插入图片、表格到书签;读取、替换书签

    概要 书签的设置可以帮助我们快速的定位某段文字,使用起来很方便,也很节省时间.在前一篇文章“C# 如何添加/删除Word书签”中介绍了插入.删除书签的方法,本篇文章将对C# 操作Word书签的功能做进 ...

  4. Angular 中的 dom 操作(ViewChild)以及父子组件中通过 ViewChild 调用子组件的方法

    <app-header #header></app-header> <div #myBox> 我是一个dom节点 </div> <button ( ...

  5. 学习篇:NodeJS中的模板引擎:jade

    NodeJS 模板引擎作用:生成页面 在node常用的模板引擎一般是 1.jade --破坏式的.侵入式.强依赖(对原有的html体系不友好,走自己的一套体系)2.ejs --温和的.非侵入式的.弱依 ...

  6. 【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】

    一.JQuery中样式的操作 1.给id=mover的div采用属性增加样式.one $("#b1").click(function(){ $("#mover" ...

  7. python中的赋值操作和复制操作

    之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...

  8. SqlServer中的merge操作(转载)

    SqlServer中的merge操作(转载)   今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有 ...

  9. 进入wordpress中的模板文件

    Wordpress的页面结构 一个简单的wordpress由 头部.内容.页脚组成,每个块中的每一个都由当前wordpress主题中模板文件生成. eg: 头:包含重要的信息,一般都是网页的头部. 内 ...

随机推荐

  1. 【MyBean-开源框架】进行简单的逻辑插件(演示在控制台中应用)

    [说明] 很多时候大家认为客户端插件一般是窗体.其实不然,很多功能都可以看成是插件,比如一个单据的审批功能,一个单据上面,单价的获取功能,都可以看成是插件,然后后期通过配置,可以灵活进行切换.MyBe ...

  2. LeetCode: Search Insert Position 解题报告

    Search Insert Position Given a sorted array and a target value, return the index if the target is fo ...

  3. celery 实例进阶

    认识 这里有几个概念,task.worker.broker.顾名思义,task 就是老板交给你的各种任务,worker 就是你手下干活的人员. 那什么是 Broker 呢? 老板给你下发任务时,你需要 ...

  4. Spring Batch中job的启动,停止,放弃操作

    1,启动一个job 运行一个批处理任务至少有两点要求:一个 JobLauncher 和一个用来运行的 job .它们都包含了相同或是不同的 context .举例来说,从命令行来启动job,会为每一个 ...

  5. 基于jQuery仿QQ音乐播放器网页版代码

    基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="m ...

  6. Android 避免APP启动闪黑屏(Theme和Style)

    前几天Boss就反应说,机器每次启动程序都会闪一下黑屏,这个客户不接受.没办法,只能想想怎么解决,最后找到了下面的方法.闪黑屏的原因主要是我们启动Activity的时候,需要跑完onCreate和on ...

  7. Android 两级菜单栏

    这里来记录下,android 的两级菜单栏,就是顶部切换,和底部的切换.因为在这个上面整了太久的时间,所以特此记录下. 第一种: 先介绍一个网上别人写出来的效果吧,这个当时积分真的很高..CSDN30 ...

  8. swift @AUTOCLOSURE 和 ?? ||

    * {-webkit-tap-highlight-color: rgba(0,0,0,0);}html {-webkit-text-size-adjust: none;}body {font-fami ...

  9. 9g10在nandflash扇区的分配地址

  10. 枚举Enum和常量0之间的恩怨

    1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...