другой формат в одну строку Interop.word - PullRequest
6 голосов
/ 12 апреля 2011

Я пытался выяснить, как вставить 2 разных формата в один и тот же абзац, используя interop.word в c # следующим образом:

привет планета земля вот что я хочуделаем

Ответы [ 6 ]

5 голосов
/ 17 июля 2011

Если ваш документ определен как oDoc, следующий код должен дать вам желаемый результат:

Word.Paragraph oPara = oDoc.Content.Paragraphs.Add(ref oMissing);
oPara.Range.Text = "hello planet earth here's what I want to do";
object oStart = oPara.Range.Start + 13;
object oEnd = oPara.Range.Start + 18;

Word.Range rBold = oDoc.Range(ref oStart, ref oEnd);
rBold.Bold = 1;
4 голосов
/ 09 апреля 2012

Мне пришлось немного изменить ответ Денниса, чтобы он работал на меня.

То, что я делаю, полностью автоматизировано, поэтому мне приходится работать только с переменными.

private void InsertMultiFormatParagraph(string text, int size, int spaceAfter = 10) {
    var para = docWord.Content.Paragraphs.Add(ref objMissing);

    para.Range.Text        = text;
    // Explicitly set this to "not bold"
    para.Range.Font.Bold   = 0;
    para.Range.Font.Size   = size;
    para.Format.SpaceAfter = spaceAfter;

    var start = para.Range.Start;
    var end   = para.Range.Start + text.IndexOf(":");

    var rngBold = docWord.Range(ref objStart, ref objEnd);
    rngBold.Bold = 1;

    para.Range.InsertParagraphAfter();
}

Основное отличие, которое заставило меня захотеть сделать этот пост, заключалось в том, что абзац должен быть вставлен ПОСЛЕ изменения шрифта. Сначала я хотел вставить его после установки свойства SpaceAfter, но затем значения objStart и objEnd отбрасывали исключения «OutOfRange». Это было немного нелогично, поэтому я хотел убедиться, что все знают.

2 голосов
/ 04 мая 2014

Следующий код показался мне лучшим при форматировании определенного выделения в абзаце.Используя встроенную в Word функцию «найти», вы делаете выбор, а затем форматируете только выделенный текст.Этот подход будет работать хорошо только в том случае, если выбранный текст является уникальной строкой в ​​документе.Но для большинства ситуаций, с которыми я столкнулся, это похоже на работу.

        oWord.Selection.Find.Text = Variable_Containing_Text_to_Select;
        oWord.Selection.Find.Execute();
        oWord.Selection.Font.Bold = 1;

Если строка текста, которую вы перетаскиваете в абзац, происходит из базы данных, оператора switch или какого-либо другого метода, тогда я просто перетаскиваю этот текст в переменную строку и использую ее для выполненияфункция поиска.

Надеюсь, это кому-нибудь поможет!

1 голос
/ 29 сентября 2015

Я знаю, что это сообщение старое, но оно появилось почти во всех моих поисках.Ответ ниже в случае, если кто-то, как я, хочет сделать это для более чем одного слова в предложении.В этом случае я перебираю строковый массив переменных, содержащих строки, и изменяю этот текст на жирный - modifing @ joshman1019

string[] makeBold = new string[4] {a, b, c, d};

foreach (string s in makeBold)
{
   wApp.Selection.Find.Text = s; //changes with each iteration
   wApp.Selection.Find.Execute(); 
   wApp.Selection.Font.Bold = 1;
   wApp.Selection.Collapse(); //used to 'clear' the selection
   wApp.Selection.Find.ClearFormatting();
}

Таким образом, каждая строка, представленная переменной, будет выделена жирным шрифтом.Так что если a = "hello world", то Hello World выделено жирным шрифтом в документе Word.Надеюсь, это сэкономит кому-то время.

0 голосов
/ 26 апреля 2017

Рассмотрим возможность использования Range.Collapse в конечном итоге с Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd в качестве параметра. Это позволит форматировать следующий текст, отличный от предыдущего (, а форматирование следующего текста не повлияет на форматирование предыдущего ).

0 голосов
/ 05 января 2016

Я знаю, что это старая ветка, но я все равно решил написать здесь для тех, кто сталкивается с ней через Google (как я сделал). Я получил большую часть пути к решению с помощью подхода крилгара, но у меня возникли проблемы, потому что некоторые из моих текстов содержат переводы строк. Соответственно, эта модификация работала лучше всего для меня:

private void WriteText(string text)
    {
        var para = doc.Content.Paragraphs.Add();
        var start = para.Range.Start;
        var end = para.Range.Start + text.IndexOf(":");
        para.Range.Text = text;
        para.Range.Font.Bold = 0;
        para.Range.InsertParagraphAfter();

        if(text.Contains(":")){
            var rngBold = doc.Range(start, end);
            rngBold.Bold = 1;
        }
    }

Ключевым отличием является то, что я вычисляю начало и конец в функции раньше. Я не могу понять, что это, но я думаю, что если в вашем новом тексте есть новые строки, последующее вычисление начала / конца что-то испортит.

И, очевидно, мое решение предназначено для текста в формате:

Метка: данные

где метка должна быть выделена жирным шрифтом.

...