我一直试图弄清楚如何使用c#中的interop.word将2种不同的格式插入到同一段落中,如下所示:
你好星球地球这就是我想做的事情
答案 0 :(得分:5)
假设您的文档定义为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;
答案 1 :(得分:4)
我不得不修改Dennis的答案,让它为我工作。
我所做的完全是自动化的,所以我只能使用变量。
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 :(得分:2)
在格式化段落中的特定选择时,以下代码对我来说似乎最有效。使用Word内置的“查找”功能进行选择,然后仅格式化选定的文本。如果要选择的文本是文档中的唯一字符串,则此方法仅适用。但是对于我遇到过的大多数情况,这似乎都有效。
oWord.Selection.Find.Text = Variable_Containing_Text_to_Select;
oWord.Selection.Find.Execute();
oWord.Selection.Font.Bold = 1;
如果要放入段落的文本字符串来自数据库,switch语句或其他方法,那么我只是将该文本放入变量字符串并使用它来执行find函数。
希望这有助于某人!
答案 3 :(得分:1)
我知道这篇文章很老,但几乎所有的搜索结果都出来了。下面的答案是万一有人像我一样想要在一个句子中为多个单词做这件事。在这种情况下,我遍历一个包含字符串的变量的字符串数组,并将该文本更改为粗体 - 修改@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文档中变为粗体。希望能节省一些时间。
答案 4 :(得分:0)
我知道这是一个旧帖子,但我想我会在这里发帖给那些通过谷歌遇到它的人(就像我一样)。我通过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;
}
}
关键的区别在于我在函数中更早地计算了开始和结束。我不能完全指责它,但我认为如果你的新文本中有新行,那么后期的开始/结束计算会让人感到困惑。
显然我的解决方案适用于格式为
的文本标签:数据
其中Label是粗体。
答案 5 :(得分:0)
最后考虑使用Range.Collapse
Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd
作为参数。
这将允许下一个文本的格式不同于以前的文本(和下一个文本格式不会影响前一个的格式化)。