Объект 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
' ----------------------------------------------------------------------------
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 и получилось немного сэкономить места.

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