C#中按模板操作Word —— 如何向Word中插入圖片


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM