Изменение цвета шрифта в документе 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" };
}
Если у кого-то есть более элегантное решение, добавьте его, и я его озвучу.