比如说我们可以通过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)
{
}
(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对象的原因。
在name书签里我们需要填写自己的姓名,然后在picture书签里,我们要插入头像。
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 [email protected]:HymanLiuTS/OfficeTestByC-.git
获取本文源代码:
git checkout L06