C# 将不同格式转换为一行Interop.word

C# 将不同格式转换为一行Interop.word,c#,ms-word,ms-office,office-interop,C#,Ms Word,Ms Office,Office Interop,我一直在想如何使用c#中的interop.word在同一段落中插入两种不同的格式,如下所示: hello planetearth以下是我想做的事情假设您将文档定义为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

我一直在想如何使用c#中的interop.word在同一段落中插入两种不同的格式,如下所示:


hello planetearth以下是我想做的事情

假设您将文档定义为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;

我不得不对丹尼斯的答案稍加修改,让它对我有用

我所做的是完全自动化的,所以我只需要处理变量

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”异常。这有点违反直觉,所以我想确保每个人都知道。

在设置段落中特定选项的格式时,以下代码似乎最适合我。使用Word内置的“查找”功能进行选择,然后仅格式化所选文本。只有当要选择的文本是所选内容中唯一的字符串时,这种方法才能很好地工作。但对于我遇到的大多数情况,这似乎是可行的

        oWord.Selection.Find.Text = Variable_Containing_Text_to_Select; // sets the variable for find and select
        oWord.Selection.Find.Execute(); // Executes find and select
        oWord.Selection.Font.Bold = 1; // Modifies selection
        oWord.Selection.Collapse();  // Clears selection

希望这对别人有帮助

我知道这篇文章很旧,但几乎在我所有的搜索中都能找到。下面的答案是,如果像我这样的人想在一个句子中用一个以上的词来表达。在本例中,我循环遍历包含字符串的变量字符串数组,并将该文本更改为粗体--modifying@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在单词doc中变为粗体。希望这能节省一些时间

我知道这是一个老帖子,但我想我还是会在这里为那些通过谷歌看到它的人发帖(就像我做的那样)。我用krillgar的方法找到了解决方案的大部分方法,但我遇到了麻烦,因为我的一些文本包含了换行符。因此,这一修改对我最为有效:

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;
        }
    }
关键的区别在于我在函数中提前计算开始和结束。我不太清楚,但我认为如果你的新文本中有新行,后面的开始/结束计算会把事情搞砸

显然,我的解决方案是针对以下格式的文本:

标签:数据


标签以粗体显示。

考虑使用
Range.Collapse
作为参数,最终使用
Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd

这将允许下一个文本的格式不同于上一个文本(并且下一个文本格式不会影响上一个文本的格式)。

+1因为它看起来可以工作,但必须有一种方法来切换样式,然后添加字符,而不必事后应用样式。“我还不能对他的答案发表评论”依我看,如果你提出新的代码或是一个非琐碎的修改,那么一个新的答案无论如何都是正确的方法。但是我怀疑
.Bold
值使用的是真/假常量。我也在想同样的事情,除了粗体(以及斜体、下划线等)都是数据类型int的属性。1为“真”,0为“假”。它默认为-1,因此有第三个“unset”选项。与Office互操作的一切一样,它的工作方式有点违反直觉。所有的遗留代码让新手(像我一样)很难使用。谢谢!这对我有帮助。只是想在运行oWord.Selection.Find.Execute()后添加一个,以防其他人看到这一点;然后需要运行oWord.Selection.Collapse();在运行另一个Selection.Find之前。这将清除第一个选择。这是很好的建议。谢谢我修改了我的答案,加入了你的建议,因为这似乎是一个共同的需要。