09
2019
01

c# word 操作系列之Range对象

Range对象也代表一个区域。与使用Selection相比较,Range的优势在于

l  执行给定任务需要较少的代码

l  不需要改变当前文档的选中区域(donot have to change the       highlighting)

l  Has greater capabilities

定义并选择一个Range

 下面的代码新建一个Range对象,并选择文档的前7个字符,包括non-printing字符,然后使用Select方法是Range可见(即高亮显示)。如果不使用Select方法,在Word界面中你将看不到Range对象的区域,但是可以在程序中操作。

// C#Object start = 0;
Object end = 7;
Word.Range rng = ThisDocument.Range(ref start, ref end);
rng.Select();

1.1  Counting Characters

// 选择整个文档,并显示字符总数
Object start = Type.Missing;
Object end = ThisDocument.Characters.Count;
Word.Range rng = ThisDocument.Range(ref start, ref end);
rng.Select();
MessageBox.Show("Characters: " +ThisDocument.Characters.Count.ToString());

1.2  Setting Up Ranges

你可以使用Content属性使Range包含整个文档内容

// C#Word.Range rng = ThisDocument.Content;

下面的例子完成以下功能:

  • 新建一个 Range变量

  • 检查文档中是否至少含有两个句子

  • 使Range的起始点为第二个句子的开头

  • 使Range的结束点为第二个句子的结尾

  • 高亮显示该Range

public void SelectSentence() {
    Word.Range rng;
    if (ThisDocument.Sentences.Count >= 2 )
    {
    // Supply a Start and end value for the Range.
    Object start = ThisDocument.Sentences[2].Start;
    Object end = ThisDocument.Sentences[2].End;
    rng = ThisDocument.Range(ref start, ref end);
    rng.Select();
    }
}

扩展Range

定义Range对象后,可以使用MoveStart和MoveEnd方法扩展它的范围。这两个函数使用两个相同的参数:Unit与Count。其中Unit参数是WdUnits类型,它有如下可选值:

  • wdCharacter

  • wdWord

  • wdSentence

  • wdParagraph

  • wdSection

  • wdStory

  • wdCell

  • wdColumn

  • wdRow

  • wdTable

下面的例子演示了:定义一个Range包含文档的前7个字符,然后移动其开始点7个字符长度,于是结果是原来的Range变成了一个insertion point;然后使用MoveEnd方法使其结束点移动7个字符

// C#// Define a range of 7 characters.
Object start = 0;Object end = 7;
Word.Range rng = ThisDocument.Range(ref start, ref end);
// Move the starting position 7 characters.
Object unit = Word.WdUnits.wdCharacter;
Object count = 7;
rng.MoveStart(ref unit, ref count);
// Move the ending position 7 characters.
unit = Word.WdUnits.wdCharacter;
count = 7;
rng.MoveEnd(ref unit, ref count);

下图展示了上述代码的移动过程

获得Range的首字符和尾字符

MessageBox.Show(String.Format("Start: {0}, End: {1}",rng.Start, rng.End), "Range Start and End");
使用SetRange方法
// C#Word.Range rng;
Object start = 0;
Object end = 7;
rng = ThisDocument.Range(ref start, ref end);
// Reset the existing Range.
rng.SetRange(ThisDocument.Sentences[2].Start,ThisDocument.Sentences[5].End);
rng.Select();

格式化文本

若要给Range指定格式,你首先需要指定一个Range,然后应用格式。

下面的代码演示了如下过程:

1.    选择文档中的第一段,然后设置字号字体以及对齐,

2.    弹出对话框

3.    调用三次Undo方法回退之前的操作

4.    应用Normal IndentStyle然后弹出对话框

5.    调用一次Undo方法然后弹出对话框

// C#
public void FormatRangeAndUndo() 
{
    // Set the Range to the first paragraph.
    Word.Range rng = ThisDocument.Paragraphs[1].Range;
 
    // Change the formatting.
    rng.Font.Size = 14;
    rng.Font.Name = "Arial";
    rng.ParagraphFormat.Alignment =
    Word.WdParagraphAlignment.wdAlignParagraphCenter;
    rng.Select();
    MessageBox.Show("Formatted Range", "FormatRangeAndUndo");
 
    // Undo the three previous actions.
    Object times = 3;
    ThisDocument.Undo(ref times);
    rng.Select();
    MessageBox.Show("Undo 3 actions", "FormatRangeAndUndo");
 
    // Apply the Normal Indent style.
    Object style = "Normal Indent";
    rng.set_Style(ref style);
    rng.Select();
    MessageBox.Show("Normal Indent style applied", 
      "FormatRangeAndUndo");
 
    // Undo a single action.
    times = 1;
    ThisDocument.Undo(ref times);
    rng.Select();
    MessageBox.Show("Undo 1 action", "FormatRangeAndUndo");
}

插入文本

你可以使用Range对象的Text属性用于向文档中插入文本。下面的代码在文档的开始处插入 “New Text”字符串。然后选择该区域。

// C#string  str = " new Text ";
Object start = 0;
Object end = 0;
Word.Range rng = ThisDocument.Range(ref start, ref end);
rng.Text = str;
rng.Select();

替换文本

// C#
start = 0;
end = 12;
rng = ThisDocument.Range(ref start, ref end);
rng.Text = str;
rng.Select();

8 Collapsing a Range of Selection

当使用Range对象或者Selection对象时,有可能需要在一段文字前插入文本的同时又不想覆盖原来的文本,Range对象和Selection对象都有Collapse方法,该方法使用了两个枚举值:

WdCollapseStart:Collapses the selection to thebeginning of itself

WdCollapseEnd:Collapsesthe selection to the end of itself

下面的例子首先创建一个Range,然后使其包含文档的第一段,然后使用wdCollapseStart枚举值Collapse该Range,然后插入新文本。

// C#
string  str = " new Text ";
Word.Range rng = ThisDocument.Paragraphs[1].Range;
Object direction = Word.WdCollapseDirection.wdCollapseStart;
rng.Collapse(ref direction);
rng.Text = str;
rng.Select();

若使用wdCollapseEnd,即:

// C#
Object direction = Word.WdCollapseDirection.wdCollapseEnd;
rng.Collapse(ref direction);

结果如下:

Tips : Collapse不是很好去翻译,通俗的说,它的功能是:当你的Range对象或者Selection对象包含的内容是一段文字时,使用Collapse()方法可以使 Range或者Selection包含的区域变成原来那段文字的前插入点或者后插入点

« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。