2011-07-22 67 views
3

我有一個帶有內容控件(所有文本)的非常簡單的Word文檔。 我想遍歷控件,用字典中的值填充它們。應該是超級簡單,但有些是錯誤的:以編程方式在.NET中的Word文檔(OpenXML)中填充內容控件

var myValues = new Dictionary<string, string>(); //And fill it 

using (var wordDoc = WordprocessingDocument.Open(outputFile, true)) 
{ 
    MainDocumentPart mainPart = wordDoc.MainDocumentPart; 

    foreach(SdtElement sdt in mainPart.Document.Descendants<SdtElement>()) 
    { 
     SdtAlias alias = sdt.Descendants<SdtAlias>().FirstOrDefault(); 

     if (alias != null) 
     { 
      string sdtTitle = alias.Val.Value; 
      sdt.??? = myValues[sdtTitle]; 
     } 
    } 
    mainPart.Document.Save(); 
} 

如何將我的值寫入文檔? 我需要一個CustomXmlPart嗎?

回答

1

如果您打算這樣做,您需要根據sdt的父元素將合適的內容寫入Sdt的SdtContent:段落或運行或tc等。

另一種方法是將字典的內容放入CustomXml部分,並在每個引用相關字典元素的內容控件上設置數據綁定。然後,Word將在第一次打開docx時解析綁定(如果您希望用戶使用其他方式打開它,這對您並不好)。

+0

謝謝,但仍不確定如何解決問題。我只想用最簡單的方法寫入docx中的內容控件。 –

+0

這裏列出的替代方案是一件壞事。在i4i案例之後,微軟已經改變了Office程序以刪除他們發現的任何自定義xml。 –

+0

@斯科特,你(可以理解)困惑。您正在考慮「自定義xml標籤」,而不是自定義xml PARTS和數據綁定。詳見http://blogs.technet.com/b/gray_knowlton/archive/2009/12/23/what-is-custom-xml-and-the-impact-of-the-i4i-judgment-on-word。 aspx – JasonPlutext

0

您可以使用此代碼。

foreach (SdtElement sdt in mainPart.Document.Descendants<SdtElement>()) 
{ 
SdtAlias alias = sdt.Descendants<SdtAlias>().FirstOrDefault(); 

if (alias != null) 
{ 
    string sdtTitle = alias.Val.Value; 
    Text t = sdt.Descendants<Text>().First(); 
    t.Text = "test"; 
} 
} 
相關問題