Изменение цвета шрифта в документе 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" };

3 ответов


я столкнулся с аналогичными проблемами и обнаружил, что по какой-то причине порядок добавления объектов к объекту 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 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);

Ну, я вроде как зверь пробился к ответу, но он работает.

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

Если у кого-то есть более элегантное решение, добавьте его, и я его озвучу.


цвет val должен быть 8 цифр. Например, цвет.Val=строка отображения" FFFF0000 " красным цветом.