Приветствую всех читателей блога 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 ' ---------------------------------------------------------------------------- Option Explicit dim oWord, oDoc, i, MyText dim oRange1, oRange2, REnd1, REnd2, OPars1, OPars2 Set oWord = CreateObject("Word.Application") ' Класс Word.Application Set oDoc = oWord.Documents ' Коллекция Documents oDoc.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 End With Next ' Вставляем в документ заданный текст For i=0 to 30 With oRange2 .Text=MyText & " второй документ " & MyText .EndOf .InsertParagraph .EndOf End With Next 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 2 End With 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 2 End With With oRange1 .SetRange 0, REnd1 .EndOf .InsertParagraph .InsertParagraph .Text=oDoc(1).Lists.Count & " - количество абзацев" End With With oRange2 ' нумерация списка в ворде .SetRange 0, REnd2 .EndOf .InsertParagraph .InsertParagraph .Text=oDoc(2).Lists.Count & " - количество абзацев" End With Sub LRange1(a, b) oRange1.SetRange 0, REnd1 oRange1.SetRange oPars1(a).Range.Start, oPars1(b).Range.End End Sub Sub LRange2(a, b) oRange2.SetRange 0, REnd2 oRange2.SetRange oPars2(a).Range.Start, oPars2(b).Range.End End Sub |
Пример на jscript:
// ---------------------------------------------------------------------------- // Коллекция Lists и объект List // Выравнивание абзаца и изменение междустрочного интервала // многоуровневый список в ворде // нумерованный список в ворде // Lists.js // ---------------------------------------------------------------------------- var oWord1, oDoc1, i, MyText1; var oRange11, oRange21, REnd1, REnd2, OPars1, OPars2; oWord1 = WScript.CreateObject("Word.Application"); // Класс Word.Application oDoc1 = oWord1.Documents; // Коллекция Documents oDoc1.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 и получилось немного сэкономить места.