C# 将不同格式转换为一行Interop.word
我一直在想如何使用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
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之前。这将清除第一个选择。这是很好的建议。谢谢我修改了我的答案,加入了你的建议,因为这似乎是一个共同的需要。