2015-06-10 133 views
0

我試圖使用OpenXML SDK和Word Document Generator生成Word文檔。我需要將我的自定義樣式應用於ContentControls(重複節)。使用OpenXML在Word文檔中的內容控件上應用樣式

遞歸佔位符,我用

foreach (var item in list) 
{ 
    var datacontext = new OpenXmlElementDataContext() 
    { 
     Element = openXmlElementDataContext.Element, 
     DataContext = item.Value 
    }; 
    var clonedElement = CloneElementAndSetContentInPlaceholders(datacontext); 
    SetContentOfContentControl(clonedElement, item.Value); 
} 
openXmlElementDataContext.Element.Remove(); 

我需要應用這個元素上我的風格。 我該怎麼辦?

我試着看到「打開XML SDK 2.5生產力工具的Microsoft Office」生成的代碼啓發我:

var moduleDatacontext = new OpenXmlElementDataContext() 
{ 
    Element = openXmlElementDataContext.Element, 
    DataContext = module.Valeur 
}; 
var moduleClonedElement = CloneElementAndSetContentInPlaceholders(moduleDatacontext); 

var sdtProperties1 = new SdtProperties(); 
var styleId1 = new StyleId() { Val = "FormationTitre2" }; 

ParagraphMarkRunProperties paragraphMarkRunProperties1 = new ParagraphMarkRunProperties(); 
RunFonts runFonts1 = new RunFonts() { ComplexScriptTheme = ThemeFontValues.MinorHighAnsi }; 

paragraphMarkRunProperties1.Append(runFonts1); 

sdtProperties1.Append(styleId1); 
sdtProperties1.Append(paragraphMarkRunProperties1); 

Run run1 = new Run() { RsidRunProperties = "00C463E5" }; 

RunProperties runProperties1 = new RunProperties(); 
RunFonts runFonts2 = new RunFonts() { ComplexScriptTheme = ThemeFontValues.MinorHighAnsi }; 

runProperties1.Append(runFonts2); 

run1.Append(runProperties1); 

moduleClonedElement.Append(sdtProperties1); 
moduleClonedElement.Append(run1); 

當我打開生成的文檔,我有這樣的錯誤:

我們很抱歉。我們無法打開「... docx」,因爲我們發現它的內容存在問題。

我驗證文檔,我可以看到15個錯誤: http://imagizer.imageshack.us/a/img633/1176/7QX5So.png

Full Size

回答

0

我已經找到了解決辦法。我搜索第一段並在其上應用我的自定義樣式。

// clone element 
var clonedElement = CloneElementAndSetContentInPlaceholders(datacontext); 

// search the first created paragraph on my clonedElement 
Paragraph p = clonedElement.Descendants<Paragraph>().FirstOrDefault(); 
if (p != null) 
    p.PrependChild<ParagraphProperties>(new ParagraphProperties()); 
// get the paragraph properties 
ParagraphProperties pPr = p.Elements<ParagraphProperties>().First(); 
// apply style 
pPr.ParagraphStyleId = new ParagraphStyleId { Val = "FormationTitre2" }; 
// set content of content control 
SetContentOfContentControl(clonedElement, item.Value); 
相關問題