2012-10-30 8 views
8

Szukałem wiele godzin i po prostu nie mogę znaleźć solidnej odpowiedzi na to. Mam istniejący dokument z elementami kontroli treści, które muszę edytować tekstem z danymi zewnętrznymi. Jeśli dane dotyczące jednego z elementów sterujących nie są obecne, muszę zastąpić tekst odpowiednią uwagą i zmienić kolor czcionki.Zmiana koloru czcionki w dokumencie tekstowym OpenXML (C#)

Mam wpis tekstowy i wszystko działa dobrze, jedyną częścią, która nie wydaje się wykonywać swojej pracy jest zmiana koloru czcionki. Obecny kod, który mam nie daje mi żadnych błędów i przebiega tą metodą dobrze, ale kiedy patrzę na gotowy dokument, wciąż jest to zwykły czarny tekst.

Mój kolor zmienia sposób: (wejście znajduje się lista wszystkich kontroli treści z tego samego znacznika)

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" }; 
     } 
    } 
} 

także uproszczenia te dwie linie w dół po prostu to/ten sam efekt

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

Odpowiedz

9

Mam podobne problemy i odkryłem, że z jakiegoś powodu kolejność dołączania obiektów do obiektu RunProperties ma wpływ na to, czy aktualizacja formatowania działa, czy nie (zauważony wzorzec jest taki, że przed dodaniem tekstu formatowanie, formatowanie tego tekstu nie jest zachowywane).

np. to działa (tekst staje pogrubienie, Cambria haseł, a kolor jest ustawiony na niebiesko)

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); 

ale to nie robi (Tekst staje Cambria Nagłówki i Bold, ale kolor pozostaje średnia czarna)

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

Cóż, w pewnym sensie brutalnie zmusiłem się do odpowiedzi, ale działa.

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

Jeśli ktoś ma bardziej eleganckie rozwiązanie, proszę go dodać, a ja go przegłosuję.

0

Kolor val powinien składać się z 8 cyfr. Na przykład Color.Val = "FFFF0000" wyświetla ciąg na czerwono.

Powiązane problemy