C# 使用Word Interop在列表前插入文本
我正在尝试在列表前插入文本。我有列表的C# 使用Word Interop在列表前插入文本,c#,range,office-interop,C#,Range,Office Interop,我正在尝试在列表前插入文本。我有列表的Microsoft.Office.Interop.Word.Range,并在列表之前获取上一个范围。然后,我尝试将我的段落文本添加到上一个范围,但是,段落将作为列表中的第一项添加,而不是添加到列表之前 // rangeObj is the Range object for the list var previousRange = rangeObj.Previous(MSWord.WdUnits.wdCharacter, 1); Paragraph para
Microsoft.Office.Interop.Word.Range
,并在列表之前获取上一个范围。然后,我尝试将我的段落文本添加到上一个范围,但是,段落将作为列表中的第一项添加,而不是添加到列表之前
// rangeObj is the Range object for the list
var previousRange = rangeObj.Previous(MSWord.WdUnits.wdCharacter, 1);
Paragraph paragraph;
if (previousRange == null)
{
var rangeCopy = rangeObj.Duplicate;
rangeCopy.InsertParagraphBefore();
paragraph = rangeCopy.Paragraphs[1];
}
else
{
paragraph = previousRange.Paragraphs[1];
}
Range range = paragraph.Range;
range.Text = String.Format("{0} {1}", "My list", range.Text);
例如。
之前:
if (previousRange.ListParagraphs.Count > 0)
之前:
else
{
paragraph = previousRange.Paragraphs[1];
}
if (previousRange == null)
{
var rangeCopy = rangeObj.Duplicate;
rangeCopy.InsertParagraphBefore();
paragraph = rangeCopy.Paragraphs[1];
}
。。您可能会覆盖列表之前的任何内容(包括其中只有\r
的空行),当我在一个示例上运行它时,很有可能会被覆盖,最终会出现奇怪的情况
在此代码中:
else
{
paragraph = previousRange.Paragraphs[1];
}
if (previousRange == null)
{
var rangeCopy = rangeObj.Duplicate;
rangeCopy.InsertParagraphBefore();
paragraph = rangeCopy.Paragraphs[1];
}
。。在列表之前插入一个新段落(这很好,尽管我不明白为什么需要将范围克隆为),然后将新段落的范围存储在局部变量段落
中。此时,段落='\r'
-(如果您在调试阶段使用调试器单步调试应用程序,同时保持word可见,则会看到此内容)。因此,此时光标正好位于列表的前面,这是您希望它位于的位置,但随后您将执行以下操作:
Range range = paragraph.Range;
range.Text = "My paragraph";
。。。这意味着,您只需覆盖包括\r
在内的所有内容,而不是段落中的预挂起文本,这将导致Word将文本插入列表中,而不是在其前面
为了绕过这一点,我做了一个似乎可行的替代实现。它基于您使用列表前的范围插入文本的想法。我已经为大多数行添加了注释,因此应该直接了解正在发生的事情:)
简而言之,代码在给定文档中的每个列表之前插入一个字符串。如果列表前面的行上已经有文本,则实现将确保在列表前面插入列表描述文本,在列表前面的行上已经插入的文本之后插入列表描述文本
// rangeObj is the Range object for the list
var previousRange = rangeObj.Previous(MSWord.WdUnits.wdCharacter, 1);
Paragraph paragraph;
if (previousRange == null)
{
var rangeCopy = rangeObj.Duplicate;
rangeCopy.InsertParagraphBefore();
paragraph = rangeCopy.Paragraphs[1];
}
else
{
paragraph = previousRange.Paragraphs[1];
}
Range range = paragraph.Range;
range.Text = String.Format("{0} {1}", "My list", range.Text);
希望这有帮助:)
——更新以回答已编辑的问题:
完成第二轮要求的方法是:
...
// The paragraph before the current list is also a list -> so in order to insert text, we must do "some magic"
else if(prevRange.ListParagraphs.Count > 0)
{
// First, insert a new line -> this causes a new item to be inserted into the above list
prevRange.InsertAfter("\r");
// Modify current range to be on the line of the new list item
prevRange.Start = prevRange.Start + 1;
prevRange.End = prevRange.Start;
// Convert the list item line into a paragraph by removing its numbers
prevRange.ListFormat.RemoveNumbers();
// Insert the text
prevRange.InsertBefore(myText);
}
...
只需将该代码添加到我上面提供的示例代码的
foreach
循环中的if-else
块中,您就可以了:)我已经用MS Word 2013在我的机器上对其进行了测试,它似乎可以工作。并且在我的文本末尾添加“\r”也不起作用。它在列表项2添加一个空项,并在列表中向下移动项1和2。实际上,我想将文本前置到现有段落的前面,因此我使用了previousRange.parages[1].Range.InsertBefore(markingText+“”)代码>取而代之。我修改了代码示例来说明这一点。除了一个边缘的情况外,其他一切都很好。我在尝试在两个列表之间添加一行时仍然遇到问题。对于这种情况,我不想在前一段前面添加文本(列表项),而是作为新行。思想?我将更新我的问题以展示这个例子。@JoeW我现在更新了我的答案以反映您的编辑:)非常感谢!注意,我使用了prevRange.parations[1].Reset()
保留当前段落格式,而不是prevRange.ListFormat.RemoveNumbers()代码>将删除所有格式设置。其他一切都完全按照我的需要工作。@JoeW没问题,很高兴我能帮上忙:)