更改OpenXML Word文档中的字体颜色(C#)

Rei*_*ein 9 c# openxml

我一直在寻找几个小时,我似乎无法找到一个可靠的答案.我有一个包含内容控件的现有文档,我需要使用外部数据编辑文本.如果其中一个控件的数据不存在,那么我需要用适当的通知替换文本并更改字体颜色.

我有文本条目和所有工作正常,唯一似乎无法完成其工作的部分是更改字体颜色.我当前的代码没有给我任何错误,并且正在运行这个方法就好了,但是当我查看完成的文档时,它仍然是纯黑色文本.

我的换色方法:(输入是具有相同标签的所有内容控件的列表)

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" };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,将这两行简化为此/具有相同的效果

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

Jos*_*uty 12

我遇到了类似的问题,并发现由于某种原因,将对象附加到RunProperties对象的顺序实际上会影响格式化更新是否有效(我注意到的模式是在进行格式化之前附加文本,该文本的格式不坚持).

例如,这是有效的(文本变为粗体,Cambria标题,颜色设置为蓝色)

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 Code Online (Sandbox Code Playgroud)

但这不是(文字变成Cambria标题和粗体,但颜色保持标准黑色)

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);
Run Code Online (Sandbox Code Playgroud)


Rei*_*ein 5

嗯,我有点粗暴强迫我的方式回答,但它的确有效.

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

如果有人有一个更优雅的解决方案,请添加它,我会upvote它.