2012-10-30 276 views
8

我一直在尋找小時,我似乎無法找到一個堅實的答案。我有一個帶有內容控件的現有文檔,需要使用外部數據編輯文本。如果其中一個控件的數據不存在,那麼我需要用適當的通知來替換文本並更改字體顏色。更改OpenXML word文檔(C#)中的字體顏色

我有文本條目和所有工作得很好,唯一不會做它的工作是改變字體顏色。我目前的代碼並沒有給我任何錯誤,並且通過這種方法運行得很好,但是當我查看完成的文檔時,它仍然是普通的黑色文本。

我的顏色變化的方法,包括:(輸入是所有內容控件的具有相同標記的列表)

public void SetBlueText(List<SdtElement> sdtElement) 
{ 
    foreach (SdtElement element in sdtElement) 
    { 
     if (element != null) 
     { 
      RunProperties runProperties = element.Descendants<RunProperties>().FirstOrDefault(); 
      runProperties.Color = new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = "0EBFE9" }; 
     } 
    } 
} 

另外,簡化了這兩條線下降到只有這個/有相同的效果

element.Descendants<RunProperties>().FirstOrDefault().Color = 
         new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = "0EBFE9" }; 

回答

9

我遇到過類似的問題,並發現由於某種原因,您將對象追加到RunProperties對象的順序實際上會影響格式更新是否有效(我注意到的模式是如果您在做之前追加文本您的格式,該文本的格式不會保留)。

例如這個作品(文字變得大膽,坎布里亞標題,顏色設置爲藍色)

Run formattedRun = new Run(); 
RunProperties runPro = new RunProperties(); 
RunFonts runFont = new RunFonts() { Ascii = "Cambria(Headings)", HighAnsi = "Cambria(Headings)" }; 
Bold bold = new Bold(); 
Text text = new Text("TESTING"); 
Color color = new Color() { Val = "365F91", ThemeColor = ThemeColorValues.Accent1, ThemeShade = "BF" }; 
runPro.Append(runFont); 
runPro.Append(bold); 
runPro.Append(color); 
runPro.Append(text); 
formattedRun.Append(runPro); 

但這並不(文字變得坎布里亞標題和大膽,但顏色保持標準黑色)

Run formattedRun = new Run(); 
RunProperties runPro = new RunProperties(); 
RunFonts runFont = new RunFonts() { Ascii = "Cambria(Headings)", HighAnsi = "Cambria(Headings)" }; 
Text text = new Text("TESTING"); 
Bold bold = new Bold(); 
Color color = new Color() { Val = "365F91", ThemeColor = ThemeColorValues.Accent1, ThemeShade = "BF" }; 
runPro.Append(runFont); 
runPro.Append(bold); 
runPro.Append(text); 
runPro.Append(color); 
formattedRun.Append(runPro); 
4

嗯,我有種野蠻人強迫我回答問題,但它很有效。

List<RunProperties> runProps = element.Descendants<RunProperties>().ToList(); 
foreach (RunProperties rp in runProps) 
{ 
    rp.Color = new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = "0EBFE9" }; 
} 

如果任何人有一個更優雅的解決方案,請添加它,我會upvote它。

0

顏色值應該是8位數。例如Color.Val =「FFFF0000」以紅色顯示字符串。