一、Word对象模型的重叠性分析

本文主要介绍通过书签Bookmark向Word文档中插入图片的方法。在此之前我们先简单讨论下Word对象模型的重叠性。如果你对Word对象模型还不熟悉,请参考本专栏第一篇博文。相信你通过前几篇文章也有了解到,Word中五种对象:Applicatin、Document、Selection、Range和Bookmark似乎是重叠在一起的,什么意思呢?

比如说我们可以通过Applicatin.Documents属性的Add接口获取到Documents对象:

   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对象。

   Application app=doc.Application;

我们可以通过Bookmark对象获取到Range对象:

   foreach (Bookmark bk in doc.Bookmarks){Range range = bk.Range;}

也可以通过Range对象获取到Bookmark:

    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 加载模板文件

加载模板文件和上一节的方法相同,这里不再赘述,请直接参考下面的代码:

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();
}

这里唯一需要解释下的是下面这两句:

    bk.Select();Selection sel = app.Selection;

bk.Select();作用是把鼠标焦点定位到当前的书签出,然后通过app.Selection获取该焦点的位置。程序执行完成后生成的word文档内容如下,我们成功的把图片插入进去:

Github位置:

https://github.com/HymanLiuTS/OfficeTestByC-

克隆本项目:

git clone git@github.com:HymanLiuTS/OfficeTestByC-.git

获取本文源代码:

git checkout L06

C#中操作Word(6)—— 如何向Word中插入图片相关推荐

  1. 使用C#对Word进行读写、搜索、插入图片等操作

    使用C#对Word进行读写.搜索.插入图片等操作 一.C#中操作word的三种插件 二.创建和保存word文档 三.页面设置 四.读写文本 五.搜索功能 六.插入图片 参考文档 一.C#中操作word ...

  2. freemarker导出Word文档并在其中插入图片

    先将word转成xml格式,再用notepad将其转为ftl格式(将要填入数据的地方加个占位符,${name}) import java.io.File; import java.io.FileInp ...

  3. poi操作word文档(替换,插入图片)

    前段时间项目上要用到一个替换word中的字符以及插入图片并导出的功能,google了一番发现别人的代码跑起来多多少少有些问题,所以就自己照着poi的api写了一个工具类,在此记录下来,如果有需要的朋友 ...

  4. Word控件Spire.Doc 【书签】教程(5): 使如何在word文档的书签处插入图片

    Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库.在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建.编辑.转换和打印 Micr ...

  5. 记录使用Docx4j向word文档的指定位置插入图片遇到的坑

    使用Docx4j向指定位置插入图片 pom.xml <dependency><groupId>org.docx4j</groupId><artifactId& ...

  6. 【C#】C#使用Microsoft.Office.Interop.Word操作Word文档,向表格插入图片

    上篇:[C#]C#使用Microsoft.Office.Interop.Word操作Word文档,替换文本 Word模板: 代码: try {Application app = new Applica ...

  7. poi word文档在书签处插入图片

    src:docx文档路径 codePNGpath:图片路径 dest:docx写出路径 aaa:书签名 try { InputStream inputStream = new FileInputStr ...

  8. python操作word文档中的图片_Python操作word文档插入图片和表格的实例演示

    前言P6Q免费资源网 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码P6Q免费资源网 实例代码: ...

  9. python打开word并插入图片_Python操作word文档插入图片和表格的实例演示

    前言 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码 实例代码: # -*- coding: U ...

  10. php怎么在表格里插图片,Python操作word文档插入图片和表格的实例演示

    今天带来Python操作word文档插入图片和表格的实例演示教程详解 前言 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多 ...

最新文章

  1. Java项目:控制台商城系统(java+打印控制台)
  2. 一个c语言构造函数调用的问题(有趣)
  3. 移动互联网的创新与91生态
  4. react中使用create-react-app创建项目执行函数两次
  5. TCP/IP协议简介2
  6. MySQL 覆盖索引、最左前缀原则、索引下推
  7. 鱼塘钓鱼(信息学奥赛一本通-T1373)
  8. 深度学习《VAE-GAN》
  9. poj - 2488 A Knight's Journey
  10. 【MyBatis框架】查询缓存-一级缓存原理
  11. 360金融发布城市信用排行榜:上海、苏州位列前两位
  12. 复星金服微服务_复星金服以区块链技术解决行业痛点 “中招公信链”项目正式启动...
  13. 《程序设计技术》第三章例程
  14. C# ado.net数据库连接池,使用长连接访问数据库
  15. 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常...
  16. 【JAVA】jacob写word
  17. 淘宝商品详情API接口(商品描述信息查询接口)
  18. 吴恩达 :机器学习的六个核心算法
  19. eclipse编写web.xml中出现The word ‘...‘ is not correctly spelled
  20. android自定义播放器按钮,android – 使用exo播放器添加全屏视频按钮

热门文章

  1. 算法复杂度 O(1),O(n),O(logn),O(nlogn)的区别
  2. 回归方程的拟合优度检验_判定一元线性回归方程拟合优度的判定系数R的取值范围...
  3. APICloud 原生模块、H5模块、多端组件使用教程
  4. 【观察】戴尔易安信ECS:领跑企业级对象存储,背后的底蕴与底气
  5. 如何制作个人商业网站
  6. 联想拯救者Y7000P和Y9000P的区别
  7. 前端javascript 实现导出excel 支持分页
  8. HNUCM 道具的魅力值(贪心算法)
  9. centos7系统k8s部署gitlib-runner
  10. JScrollPane设置滚动条自动到最下(或最右)