向现有书签添加格式化文本



我想添加一些格式化的文本到现有的书签。由于某些原因,格式不工作,文本在书签外(书签的右边),而不是在书签内。

这是我到目前为止的代码:

var bmkRange = this.bookmark1.Range;
object newRangeStart = bmkRange.Start;
object newRangeEnd = bmkRange.End;
Word.Range r = Range(ref newRangeStart , ref newRangeEnd);
// if ( a == b )
// {
r.Text = "some text here, ";
r.Bold = 0;
r.Font.Name = "Verdana";
r.Font.Size = 10.0F;
// }
// else if ( c == d )
// {
r.Text += "some more text here, ";
r.Bold = -1;
r.Font.Name = "Times New Roman";
r.Font.Size = 10.0F;
// }
// else if ( e == f )
// {
r.Text += "and even more text here.";
r.Bold = 0;
r.Font.Name = "Verdana";
r.Font.Size = 20.0F;
// }

我显然做得不对。有人有什么想法吗?

这是一个使用visual studio 2013创建的word文档级项目。

您的代码有两个问题。

  1. 文本插入到书签后面。
  2. 你的样式没有正确应用。

问题#1和#2的解决方案:

这基本上是问题#2的解决方案。影响问题#1的部分在代码中进行了注释。

介绍函数:

/// <summary>
/// Appends text to a range
/// </summary>
/// <param name="range">The range to insert into.</param>
/// <param name="appendText">The text to append.</param>
/// <param name="appendedRange">The range of the appended text</param>
/// <returns>
/// The range of the combined old text and the appended text
/// </returns>
private Word.Range AppendToRange(Word.Range range, string appendText, out Word.Range appendedRange)
{
    // Fetch indexes
    object oldStartPosition = range.Start;           
    object oldEndPosition = range.End;
    object newEndPosition = (int)oldEndPosition + appendText.Length;
    // Append the text
    range.InsertAfter(appendText);
    // Define the range of the appended text
    appendedRange = Range(ref oldEndPosition, ref newEndPosition);
    // Return the range of the new combined range
    return Range(ref oldStartPosition, ref newEndPosition);
}

和更新你的代码如下:

var bookmark = this.bookmark1;
// Solution to issue #1: Keep the name of the bookmark
var bookmarkName = bookmark.Name; 
var bmkRange = bookmark.Range;
Word.Range r;
// if ( a == b )
// {
bmkRange = AppendToRange(bmkRange, "some text here, ", out r);
r.Bold = 0;
r.Font.Name = "Verdana";
r.Font.Size = 10.0F;
// }
// else if ( c == d )
// {
bmkRange = AppendToRange(bmkRange, "some more text here, ", out r);
r.Bold = -1;
r.Font.Name = "Times New Roman";
r.Font.Size = 10.0F;
// }
// else if ( e == f )
// {
bmkRange = AppendToRange(bmkRange, "and even more text here.", out r);
r.Bold = 0;
r.Font.Name = "Verdana";
r.Font.Size = 20.0F;
// } 
// Solution to issue #1: Restore the bookmark
object newBmkRange = bmkRange;
Bookmarks.Add(bookmarkName, ref newBmkRange);

问题#1解决方案的基本原理:当您追加书签时,Word将在书签后插入文本。因此,您需要在我们完成更新后恢复书签以覆盖整个范围。这是通过跟踪书签名称,然后覆盖它(有效地更新它)来完成的。

问题#2解决方案的基本原理:在代码示例中,您将一遍又一遍地对整个范围进行样式化。您需要提取附加文本的范围并为该范围设置样式。这是通过所提供函数的out参数解决的。

最新更新