一、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