Объект Word List и коллекция Lists — создание списка в ворде

Объект Word List и коллекция Lists — создание списка в ворде Объектная модель Microsoft Word

Приветствую всех читателей блога scriptcoding.ru. В этой статье мы рассмотрим коллекцию Lists и класс List объектной модели Word, которые отвечают за создание списка в ворде и позволяют обрабатывать их в групповом порядке.

Прежде всего, стоит сделать небольшое лирическое отступление. Смотрите, мы уже рассмотрели несколько компонентов, которые представляют многоуровневый и нумерованный список в ворде, и отвечают за создание списков в ворде в целом: ListGalleries, ListLevels и ListFormat. Также, советую посмотреть два примера, которые я рассмотрел в этой и этой статьях. Ладно, теперь давайте приступим к теме самой публикации…

Класс List и коллекция Lists – создание списка в ворде

Коллекция Lists – свойства, многоуровневый список в ворде

нумерованный список в ворде

Коллекция List предоставляет набор классов List, каждый из которых предоставляет отдельный блок-список. Например, документ содержит 30 абзацев, абзацы с 5 по 10 отформатированы как список и абзацы с 15 по 20 тоже отформатированы как список, тогда коллекция Lists будет содержать два объекта List.

Доступ к коллекции Lists осуществляется через одноименное свойство объекта Document.

По сути, данная коллекция предоставляет только два свойства, которые используются на практике:

Count– Количество объектов Word List.

Item(index) – Свойство позволяет получить доступ к заданному Word объекту List по его номеру.

Объект List – свойства и методы, нумерованный список в ворде

многоуровневый список в ворде

Класс List предоставляет один объект-список. Практический интерес предоставляют только некоторые его свойства и методы данного.

ListParagraphs— Возвращает коллекцию ListParagraphs, представляющую все форматированные абзацы.

Range— Возвращает объект Range.

ApplyListTemplate(ListTemplate, ContinuePreviousList, ApplyTo, DefaultListBehavior) – Данный метод выполняет ту же функцию, что и одноименный метод у объекта ListFormat.

RemoveNumbers(NumberType) — Удаляет нумерацию списка в ворде или маркеры из указанного списка. Параметр NumberType содержит значения константы WdNumberType:

  • wdNumberAllNumbers — 3 — значение по умолчанию для всех остальных случаев.
  • wdNumberListNum — 2 — Значение по умолчанию для LISTNUM полей.
  • wdNumberParagraph — 1 — Установленные заранее значения в диалоговых окнах Маркеры и нумерация.

При написании программного кода для примеров, я столкнулся с одной проблемой. Дело в том, что свойство Count коллекции Lists возвращает разное количество объектов List в зависимости от того, в какой последовательности применялось форматирование, то есть, происходило создание ворд списка. Так, мы можем сначала применить три маркера к выбранным абзацам, а уже потом применить вложенную нумерацию списка в ворде, или – последовательно создавать все списки.

Ниже я привел два примера программного кода на языках VBScript и JScrtipt, которые показывают данную ситуацию.

Пример на vbscript:

' ----------------------------------------------------------------------------' Коллекция Lists и объект List' Выравнивание абзаца и изменение междустрочного интервала' многоуровневый список в ворде' нумерованный список в ворде' Lists.vbs' ----------------------------------------------------------------------------OptionExplicit dim oWord, oDoc, i, MyTextdim oRange1, oRange2, REnd1, REnd2, OPars1, OPars2 Set oWord = CreateObject("Word.Application") ' Класс Word.ApplicationSet oDoc = oWord.Documents ' Коллекция DocumentsoDoc.Add() ' Создаем новый документoDoc.Add() ' Создаем новый документoWord.Visible = True' Делаем документ видимымSet oRange1 = oDoc(1).Range() Set oRange2 = oDoc(2).Range()  MyText = "Создание списка в ворде " ' Вставляем в документ заданный текстFor i=0 to 30 With oRange1 .Text=MyText & " первый документ " & MyText .EndOf .InsertParagraph .EndOf EndWithNext ' Вставляем в документ заданный текстFor i=0 to 30 With oRange2 .Text=MyText & " второй документ " & MyText .EndOf .InsertParagraph .EndOf EndWithNext Set oPars1 = oRange1.Paragraphs Set oPars2 = oRange2.Paragraphs  REnd1 = oPars1(oPars1.Count).Range.End REnd2 = oPars2(oPars2.Count).Range.End  With oRange1.ListFormat call LRange1(5,10) .ApplyBulletDefault 2 call LRange1(7,9) .ApplyNumberDefault 2 call LRange1(15,22) .ApplyBulletDefault 2 call LRange1(17,20) .ApplyNumberDefault 2 call LRange1(25,29) .ApplyBulletDefault 2EndWith With oRange2.ListFormat call LRange2(5,10) .ApplyBulletDefault 2 call LRange2(15,22) .ApplyBulletDefault 2 call LRange2(25,29) .ApplyBulletDefault 2 call LRange2(7,9) .ApplyNumberDefault 2 call LRange2(17,20) .ApplyNumberDefault 2EndWith With oRange1 .SetRange 0, REnd1 .EndOf .InsertParagraph .InsertParagraph .Text=oDoc(1).Lists.Count & " - количество абзацев"EndWith With oRange2' нумерация списка в ворде .SetRange 0, REnd2 .EndOf .InsertParagraph .InsertParagraph .Text=oDoc(2).Lists.Count & " - количество абзацев"EndWith Sub LRange1(a, b)oRange1.SetRange 0, REnd1oRange1.SetRange oPars1(a).Range.Start, oPars1(b).Range.EndEndSub Sub LRange2(a, b)oRange2.SetRange 0, REnd2oRange2.SetRange oPars2(a).Range.Start, oPars2(b).Range.EndEndSub

Пример на jscript:

// ----------------------------------------------------------------------------// Коллекция Lists и объект List// Выравнивание абзаца и изменение междустрочного интервала// многоуровневый список в ворде// нумерованный список в ворде// Lists.js// ----------------------------------------------------------------------------var oWord1, oDoc1, i, MyText1;var oRange11, oRange21, REnd1, REnd2, OPars1, OPars2; oWord1 = WScript.CreateObject("Word.Application");// Класс Word.ApplicationoDoc1 = oWord1.Documents;// Коллекция DocumentsoDoc1.Add();// Создаем новый документoDoc1.Add();// Создаем новый документoWord1.Visible=true;// Делаем документ видимымoRange11 = oDoc1(1).Range(); oRange21 = oDoc1(2).Range();  MyText1 ="Создание списка в ворде "; // Вставляем в документ заданный текстfor(i=0; i<=30; i++){ with(oRange11){ Text=MyText1 +" первый документ "+ MyText1; EndOf(); InsertParagraph(); EndOf();}} // Вставляем в документ заданный текстfor(i=0; i<=30; i++){ with(oRange21){ Text=MyText1 +" второй документ "+ MyText1; EndOf(); InsertParagraph(); EndOf();}} oPars1 = oRange11.Paragraphs; oPars2 = oRange21.Paragraphs;  REnd1 = oPars1(oPars1.Count).Range.End; REnd2 = oPars2(oPars2.Count).Range.End;  with (oRange11.ListFormat){ LRange1(5,10); ApplyBulletDefault(2); LRange1(7,9); ApplyNumberDefault(2); LRange1(15,22); ApplyBulletDefault(2); LRange1(17,20); ApplyNumberDefault(2); LRange1(25,29); ApplyBulletDefault(2);} with (oRange21.ListFormat){ LRange2(5,10); ApplyBulletDefault(2); LRange2(15,22); ApplyBulletDefault(2); LRange2(25,29); ApplyBulletDefault(2); LRange2(7,9); ApplyNumberDefault(2); LRange2(17,20); ApplyNumberDefault(2);} with (oRange11){ SetRange(0, REnd1); EndOf(); InsertParagraph(); InsertParagraph(); Text=oDoc1(1).Lists.Count+" - количество абзацев";} with (oRange21){ SetRange(0, REnd2); EndOf(); InsertParagraph(); InsertParagraph(); Text=oDoc1(2).Lists.Count+" - количество абзацев";//нумерация списка в ворде} function LRange1(a, b){oRange11.SetRange(0, REnd1);oRange11.SetRange(oPars1(a).Range.Start, oPars1(b).Range.End);} function LRange2(a, b){oRange21.SetRange(0, REnd2);oRange21.SetRange(oPars2(a).Range.Start, oPars2(b).Range.End);}

Хорошо, теперь давайте разберем программный код. Мы создаем один класс Application и одну коллекцию Documents. Далее происходит создание двух документов Word с помощью метода Add. Следующей задачей является добавить текст в оба документа, для этих целей мы используем объект Range, при этом, для каждого документа мы создаем собственный экземпляр. Просмотрев код, вы увидите, что мы создали по два экземпляра и для остальных объектов и коллекций.

Внешнее содержимое обоих документов идентично, хотя и создание списков в ворд происходит в разной последовательности. В итоге, для одного документа мы получим количество объектов List 4, а для другого – 5. Конечно, я мог сократить код, создав несколько универсальных процедур, но так он был бы сложнее в плане чтения. Хотя с помощью оператораWITH и получилось немного сэкономить места.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий