2012-11-07 52 views
1

我用這個代碼字代替書籤的文字:當書籤位於表格中時,我可以如何替換書籤文本?

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open("doc3.docx", true)) 
{ 

    var bookmarkStarts = wordDoc.MainDocumentPart.Document.Body.Descendants<BookmarkStart>(); 

    foreach (var start in bookmarkStarts) 
    { 
     OpenXmlElement elem = item.NextSibling(); 

       while (elem != null && !(elem is BookmarkEnd)) 
       { 
        OpenXmlElement nextElem = elem.NextSibling(); 
        elem.Remove(); 
        elem = nextElem; 
       } 

       item.Parent.InsertBefore<Run>(new Run(new Text("Hello")), item); 
    } 
    wordDoc.Close(); 
} 

但這不能正常工作,其中書籤是在表格中。

+0

您是否在'wordDoc.Close()'命令之前嘗試過'wordDoc.MainDocumentPart.Document.Save()'? – Blachshma

+0

是的,我嘗試它,但當書籤在表中,這個錯誤創建的單詞:辦公室打開XML文件... **。**文檔無法打開,因爲內容有問題 – user1784669

回答

0

您是否檢查過您沒有使用您的方法刪除任何書籤? 我已經在編輯了一小段代碼(在示例代碼中沒有var名稱項)後運行測試代碼,並且我已成功將2個書籤中的Hello插入表中,並且2個表中沒有任何問題。

這使我相信你的問題在別處。 運行程序後,你看過文檔中的open-xml嗎? 有什麼錯誤嗎?

我已經經歷過書籤被放置在word文檔中的最奇怪的地方,當你離開的地方,而不是你。

您也可以結束了書籤互相重疊這樣

<bookmark1 start><xml xml><bookmark2 start><bookmark1 end><xml xml><bookmark2 end> 

如果碰上這種情況下,你的代碼會刪除bookmarkstart 2到達bookmarkend 1日前,這將導致你的書籤不能被替換。

您會很容易遇到大型複雜文檔的問題。 我解決它的方法是在做任何編輯之前對書籤進行「排序」。

所以上面的例子將排序

我用這樣做看起來像這樣的代碼之後成爲

<bookmark1 start><xml xml><bookmark1 end><bookmark2 start><xml xml><bookmark2 end> 

var bookmarks = mainPart.Document.Body.Descendants<BookmarkStart>(); 
for (int i = 0; i < bookmarks.Count(); i++) 
{ 
    var bks = bookmarks.ElementAt(i); 
    var next = bks.NextSibling(); 
    if (next is BookmarkEnd) 
    { 
     var bme = (BookmarkEnd)next; 
     if (int.Parse(bks.Id) - int.Parse(bme.Id) == 1) 
     { 
      var copy = (BookmarkEnd)next.Clone(); 
      bks.Parent.RemoveChild<BookmarkEnd>(bme); 
      bks.Parent.InsertBefore<BookmarkEnd>(copy, bks); 
     } 
    } 
} 

,我會承認不完全傻瓜式的,但對我來說效果很好。 另一個檢查您可以添加,以避免刪除書籤是你的替代方法

這將確保當您插入文本時刪除元素你不刪除bookmarkstarts

while (elem != null && !(elem is BookmarkEnd)) //fjern elementer 
      { 
       OpenXmlElement nextElem = elem.NextSibling(); 
       if (elem.LocalName != "bookmarkStart") 
        elem.Remove(); 
       elem = nextElem; 
      } 

祝你好運:)