2012-10-30 281 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”以红色显示字符串。