2012-03-19 40 views
6

我正在尋找一種方法在使用openxml的word文檔中的書籤之後插入一些文本。到目前爲止,我已經能夠利用定位書籤如下:在openxml中插入書籤後的文本

var bookmarks = mainPart.Document.Descendants<BookmarkStart>().ToList(); 
var bookMarkToWriteAfter = bookmarks.FirstOrDefault(bm => bm.Name == insertAfterBoomark.Name); 

此書籤在Word文檔是在doc兩線的選擇。我必須在兩行選擇後插入一些文本。我試圖使用以下內容插入文本:

var run = new Run(); 
run.Append(new Text("Hello World")); 
bookMarkToWriteAfter .Parent.InsertAfterSelf(run); 

mainPart.Document.Save(); 

但是,這並不會產生所需的結果。有誰知道在word文檔中使用openxml書籤後立即插入文本的正確方法嗎?

回答

7

使用

bookMarkToWriteAfter.Parent.InsertAfterSelf(run); 

你試圖用XML直接,這並不總是可取的OpenXML的工作。

試試這個..

Body body = mainPart.Document.GetFirstChild<Body>(); 
    var paras = body.Elements<Paragraph>(); 

    //Iterate through the paragraphs to find the bookmarks inside 
    foreach (var para in paras) 
    { 
     var bookMarkStarts = para.Elements<BookmarkStart>(); 
     var bookMarkEnds = para.Elements<BookmarkEnd>(); 


     foreach (BookmarkStart bookMarkStart in bookMarkStarts) 
     { 
      if (bookMarkStart.Name == bookmarkName) 
      { 
       //Get the id of the bookmark start to find the bookmark end 
       var id = bookMarkStart.Id.Value; 
       var bookmarkEnd = bookMarkEnds.Where(i => i.Id.Value == id).First(); 

       var runElement = new Run(new Text("Hello World!!!")); 

       para.InsertAfter(runElement, bookmarkEnd); 

      } 
     } 
    } 
    mainPart.Document.Save(); 
+0

我有一個要求,這樣我需要找到所有整個文檔中的書籤就在蝙蝠身上。這是因爲在進行文本插入之前,通常會對它們全部進行通用處理。那麼是否有辦法一次處理所有書籤,而不是按段落分割? – 2012-03-19 17:08:25

+1

您可能會得到所有書籤的列表並使用它們(取決於您要使用的書籤),但對於插入文本,最好使用段落元素插入。 – Flowerking 2012-03-19 18:30:08

1

你不能假設一個書籤,並開始在一個段落結束。書籤可以以不同的元素開始和結束,並且可以是以下的子項:

bdo(第17.3.2.3節);正文(第17.2.2節);評論(§17.13.4.2); customXml(第17.5.1.6節); customXml(第17.5.1.4節); customXml(第17.5.1.5節); customXml(第17.5.1.3節); deg(§22.1.2.26); del(§17.13.5.14); den(§22.1.2.28); dir(第17.3.2.8節); docPartBody(§17.12.6); e(§22.1.2.32);尾註(第17.11.2節); fldSimple(§17.16.19); fName(§22.1.2.37);腳註(第17.11.10節); ftr(第17.10.3節); hdr(§17.10.4);超鏈接(§17.16.22); (第17.13.5.18節); lim(§22.1.2.52); moveFrom(第17.13.5.22節); moveTo(第17.13.5.25節); (§22.1.2.75); oMath(§22.1.2.77); p(§17.3.1.22); rt(§17.3.3.24); rubyBase(§17.3.3.27); sdtContent(第17.5.2.34節); sdtContent(第17.5.2.33節); sdtContent(第17.5.2.35節); sdtContent(第17.5.2.36節); smartTag(§17.5.1.9); sub(§22.1.2.112); sup(§22.1.2.114); tbl(§17.4.38); tc(§17.4.66); TR(§17.4.79)

https://msdn.microsoft.com/en-gb/library/documentformat.openxml.wordprocessing.bookmarkstart(v=office.15).aspx

這意味着你需要爲所需的BookmarkEnd元素檢查時看文檔中的所有元素BookmarkEnd。

Body body = mainPart.Document.GetFirstChild<Body>(); 
var bookMarkStarts = body.Descendants<BookmarkStart>(); 
var bookMarkEnds = body.Descendants<BookmarkEnd>(); 

foreach (BookmarkStart bookMarkStart in bookMarkStarts) 
{ 
    if (bookMarkStart.Name == bookmarkName) 
    { 
     //Get the id of the bookmark start to find the bookmark end 
     var id = bookMarkStart.Id.Value; 
     var bookmarkEnd = bookMarkEnds.Where(i => i.Id.Value == id).First(); 

     var runElement = new Run(new Text("Hello World!!!")); 

     bookmarkEnd.Parent.InsertAfter(runElement, bookmarkEnd); 
    } 
} 
mainPart.Document.Save(); 

您可能想要檢查Run是否可以添加到父級並添加到不同的祖先或創建新的Paragraph。

(我本來希望已經加入此爲Flowerking的答案評論,但我不能在這個答案發表評論,所以我已經修改了他們的代碼。)

相關問題