2017-08-29 24 views
1

我想在使用Open Xml SDK的Word內容控件中注入一些段落。什麼是在Word內容控件中注入一些富文本段落的正確方法?

我的代碼似乎工作(段文字在文件中可見)。但是,控件控件無法編輯。我只能在插入新內容前刪除整個內容。

如何模仿手動複製/粘貼到內容控件中?

僅供參考,這裏是我的代碼:

var mainPart = package.MainDocumentPart; 

var sdtRuns = mainPart.Document.Descendants<SdtElement>().Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == "TagOfMyContentControl"); 

foreach (var sdtBlock in sdtRuns) 
{ 
    List<Paragraphs> paragraphs = GetParapraphsFromSomewhere(); 
    var contentControlParagraph = sdtBlock.Descendants<SdtContentBlock>().First(); 
    contentControlParagraph.RemoveAllChildren(); 
    contentControlParagraph.Append(paragraphs); 
} 

mainPart.Document.Save(); 

PS:我更普遍的方式,是有解釋的Word ML元素的目的和層次結構的任何資源?

回答

1

您的代碼接近模仿複製粘貼到內容控件。下面兩行是被刪除的所有段落的內容控制線:

var contentControlParagraph = sdtBlock.Descendants<SdtContentBlock>().First(); 
contentControlParagraph.RemoveAllChildren(); 

相反,你需要確定你想要把你的段落和Append它。

例如,我有一個名爲CopyPasteCC的富文本內容控件的docx。該圖像以開發人員模式顯示文檔。內容控件有3個現有段落。

enter image description here

然後,我用以下內容替換代碼:

 var mainPart = document.MainDocumentPart; 

     var sdtRuns = mainPart.Document.Descendants<SdtElement>().Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == "CopyPasteCC"); 

     sdtRuns.ElementAt(0).Descendants<Paragraph>().ElementAt(1).InsertAfterSelf(
      new Paragraph(new Run(new Text("Hello - this is new Copy Paste paragraph"))) 
      ); 

     mainPart.Document.Save(); 

第三行選擇所有的第二行中找到的內容控制裏面的段落。然後在第二個現有段落之後插入一個新段落。下圖是該代碼後,上述文件已跑:

enter image description here

要回答你的PS的問題 - 有正規OpenXML Specification你可以嘗試閱讀。這不容易閱讀,但它是權威的規範。有一個更通用的(但過時的)免費電子書名爲OpenXml Explained

我每個月都會參考一次這些信息。 OpenXml Explained的第一章涵蓋了WordprocessingML,並且在第39頁上有一個關於結構化文檔標籤的部分,其中有一個關於內容控件的概述。

相關問題