C# Word Interop,将剪贴板粘贴到段落中

4
我正在制作一个报表生成器,可以在word中生成报告的开头。然后让用户持续使用word完成报告。报表生成器从数据库获取RTF内容,并将其用作段落。对于每个RTF,文档内创建一个段落,并将RTF添加到其中。
我读到的资料似乎暗示着,如果要将rtf插入到Word文档中,则需要将其放入剪贴板,然后从剪贴板中粘贴到Word中。这样操作是可行的,但它实际上并不是按照我想要的方式将其放入段落中。当调用粘贴方法时,它并没有将RTF置于段落范围内,而是将其粘贴在段落开始的位置。它没有覆盖段落,仍然存在于我所粘贴的RTF块下方。将范围移动一位以适应段落标记并不能解决问题,它只会将其粘贴在段落下方。我认为它需要使用Insert()方法而不是Paste()方法,但我不知道如何这样做,也找不到任何关于如何进行此操作的信息。我可以正常地从构建块或插入纯文本中插入,但被插入的文本需要格式化,而且包含了不同用户创建的多种风格等。
复制到剪贴板和粘贴的代码如下:
Clipboard.SetText(richTextBox1.Rtf, TextDataFormat.Rtf);
oPara[i].Range.Paste();

我知道您可以使用以下方法将构建块插入段落中,以保留段落格式:

tTemplate.BuildingBlockEntries.Item(foundList[i]).Insert(oPara[i].Range.FormattedText);

但是我找不到如何在我的情况下实现这一点。
我想插入到段落中的原因是要编辑格式的某些方面,并确保诸如不要跨页换行等。
我当前用于创建和插入的代码如下:
Word.Paragraph[] oPara = new Word.Paragraph[foundList.Count];

for (int i = 0; i < foundList.Count; i++)
{
    oPara[i] = oDoc.Content.Paragraphs.Add();
    Clipboard.SetText(foundList[i].Paragraph, TextDataFormat.Rtf);
    oPara[i].Range.InsertParagraphAfter();
    oPara[i].Range.Paste();
    oPara[i].KeepTogether = -1;
    oPara[i].Range.Font.Size = 10;
    oPara[i].Range.Font.Name = "Arial";
}

我使用线条检查了段落的精确位置。
oPara[0].Range.Select(); //To see first paragraph

结果是rtf粘贴在段落开始的位置,而段落就在粘贴的rtf下面。 您如何将rtf按照我想要的方式插入到MS-Word的段落中?

编辑:调用折叠方法并不能实现我想要的效果。


如果您不想替换范围的内容,请在使用此方法之前使用Collapse方法。 - Hans Passant
1个回答

2

找到了解决方案,粘贴方法实际上会在段落标签内粘贴,问题在于当文本输入到富文本框中时,富文本框会自动添加段落标签,无论最初是否有。由于rtf具有段落标签,因此它被视为不同的段落。因此,从数据库中获取的rtf具有由富文本框而非用户添加的段落标签。为了解决这个问题,我只是从数据库中获取的rtf中删除了段落标签。下面是我最终使用的代码:

for (int i = 0; i < foundList.Count; i++)
{
    oPara[i] = oDoc.Content.Paragraphs.Add();
    string tempS = foundList[i].Paragraph;
    tempS = tempS.Replace("\\pard", "");
    tempS = tempS.Replace("\\par", "");
    Clipboard.SetText(tempS, TextDataFormat.Rtf);
    oPara[i].Range.InsertParagraphAfter();
    oPara[i].Range.Paste();
    oPara[i].KeepTogether = -1;
    oPara[i].Range.Font.Size = 10;
    oPara[i].Range.Font.Name = "Arial";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接