Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Word Interop在列表前插入文本_C#_Range_Office Interop - Fatal编程技术网

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);
例如。 之前:

  • 项目1
  • 项目2
  • 在(我想要的)之后:

    我的名单

  • 项目1
  • 项目2
  • 之后(我目前得到的):

  • 我的名单
  • 项目1
  • 项目2
  • 编辑: 根据Lasse的回答和我的评论,除了下面的edge案例外,我正在让所有的事情都正常进行。注意:第二个列表不是第一个列表的子列表,每个列表之间没有空行

    if (previousRange.ListParagraphs.Count > 0)
    
    之前:

  • 项目1
  • 项目2

  • 项目3
  • 项目4
  • 在(我想要的)之后:

  • 项目1
  • 项目2

    另一份名单:

  • 项目3
  • 项目4
  • 在此代码中:

    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没问题,很高兴我能帮上忙:)