Разработка надстройки Word VSTO: как найти цвет текста в диапазоне в формате RGB?

Я разрабатываю надстройку для MS Word с использованием С#. Мне нужно найти цвет текста в объекте Range в формате RGB.

  • Я попытался использовать Range.Font.Color, который должен давать значение RGB. Но я получаю от него отрицательные и выходящие за пределы диапазона значения.
  • Range.Font.TextColor выдает исключение NotImplemented.

Я использую Visual Studio 2010. Пожалуйста, помогите мне.


person Aghoree    schedule 09.07.2012    source источник
comment
Хотели бы вы сохранить диапазон как XML, а затем запросить w:color и преобразовать его шестнадцатеричное значение в RGB? Если диапазон.   -  person JohnZaj    schedule 10.07.2012
comment
Да, у меня тоже был такой вариант. Не могли бы вы предоставить мне ссылку, где я могу прочитать о работе с Word Open XML?   -  person Aghoree    schedule 11.07.2012
comment
Начните здесь: msdn.microsoft.com/en-us/library/bb497448.aspx   -  person JohnZaj    schedule 12.07.2012
comment
Я также попытаюсь найти хороший рабочий пример кода. Я убедился, что вы можете надежно получить OpenXML ТОЛЬКО для определенного объекта Selection.Range, поэтому это должно работать и только с объектом Range. OOXML показывает w:color в шестнадцатеричном формате, поэтому вам просто нужно преобразовать шестнадцатеричный код в RGB (что также просто).   -  person JohnZaj    schedule 12.07.2012
comment
Это не будет на 100 % надежным, поскольку один вызов Range.WordOpenXML может вернуть XML-документ, состоящий из более чем одного w:color. Вернуться к чертежной доске с помощью Interop? Если вы не думаете, что у вас не будет более одного цвета в одном диапазоне, это ненадежно.   -  person JohnZaj    schedule 12.07.2012


Ответы (2)


Вот небольшой тестовый метод, который может поместить теги стиля html для цвета шрифта в документ (мне нужно было сделать это для полужирного и курсивного начертания, и я просто хотел посмотреть, смогу ли я получить цвет). Если вы поиграете с ним, вы можете получите то, что вам нужно, это С# vsto для Word

private void TEST()
{
        Range currentWord = Globals.ThisAddIn.Application.ActiveDocument.Words.First;
        object collapseStartObj = WdCollapseDirection.wdCollapseStart;
        object oText = "";
        object oMiss = System.Reflection.Missing.Value;
        object oFindStop = WdFindWrap.wdFindStop;
        object oCountOne = 1;
        object oWordUnit = WdUnits.wdWord;
        int count = 0;
        while (currentWord != null)
        {
            count++;
            currentWord.Find.Font.Bold = currentWord.Font.Bold;
            currentWord.Find.Font.Italic = currentWord.Font.Italic;
            currentWord.Find.Font.ColorIndex = currentWord.Font.ColorIndex;
            string text = currentWord.Font.ColorIndex.ToString();
            string thatColor = Regex.Replace(text, @"\d", ""); //remove any digits
            string simpleColor = Regex.Replace(thatColor, "wd", "");//remove the wd
            //MessageBox.Show(simpleColor); //for testing

            currentWord.Find.Forward = true;
            currentWord.Find.Format = true;
            currentWord.Collapse(ref collapseStartObj);
            currentWord.Find.Execute(ref oText, ref oMiss, ref oMiss, ref oMiss, ref oMiss, ref oMiss, ref oMiss, ref oFindStop, ref oMiss, ref oMiss, ref oMiss, ref oMiss, ref oMiss, ref oMiss, ref oMiss);
            if (simpleColor != "NoHighlight")
            {
                try
                {
                    string theText = currentWord.Duplicate.Text;
                    string thatText = Regex.Replace(theText, "\r", "");//get rid of carriage return

                    currentWord.Find.Execute(FindText: thatText, Format: true, ReplaceWith: "<font style = \"color:" + simpleColor + "\">^&</font>", MatchWildcards: true, Replace: Word.WdReplace.wdReplaceOne);

                }
                catch { }
            }
        currentWord = currentWord.Next(ref oWordUnit, ref oCountOne);
        }    
 }
person Chuck    schedule 11.07.2012
comment
Этот код показывает мне только ограниченные цвета, такие как красный, серый и т. д. Кроме того, отображаются такие вещи, как No Highlight. Мне нужен цвет в формате RGB. - person Aghoree; 11.07.2012

Преобразуйте Range.Font.Color в System.Drawing.Color, используя метод расширения Дона Ротмана для Преобразование WdColor из Word 2007 в класс цветов .NET

 MSWord.WdColor color = app.Selection.Range.Font.Color;
 Color myColor = color.ToColor(); //ToColor is the extension method described in link

Теперь, даже когда Range.Font.Color не возвращает фактическое значение перечисления, такое как WdOrange, а вместо этого возвращает что-то вроде: -654245889 , он будет преобразован в объект System.Drawing.Color, который содержит все данные RGB.

Работает на меня. Работает ли это для вас?

person JohnZaj    schedule 12.07.2012
comment
Ссылка не работает - и, следовательно, метод расширения недоступен, что делает этот ответ мертвым. Жаль, я мог бы действительно использовать его сейчас. - person Gertsen; 09.12.2020