Коллекция Words позволяет разбить текст на слова, и обработать их в индивидуальном порядке. Сама коллекция Words содержит набор объектов Range, что позволяет выбрать или выделить каждое слово.
Сама коллекция Words довольно проста, так как содержит минимум свойств и методов, которые пригодятся, что бы разбить текст на слова. Доступ к коллекции осуществляется через одноименное свойство, которое есть у таких объектов как:
- Range – отвечает за выбор текста.
- Selection – отвечает за выделение текста.
- Document – содержит сам документ Word.
Это хорошо, так как мы можем выбрать или выделить нужный диапазон и подсчитать в нем количество слов, или – можно в групповом порядке обработать несколько документов и содержащихся в них словах (изменить цвет, размер, стиль и так далее)
Свойства
Application — Возвращает объект Application, представляющий приложение Microsoft Word.
Count – Содержит количество слов в коллекции. Стоит учитывать, что знаки пунктуации и сам перевод строки тоже будут считаться отдельными словами-объектами.
First — Возвращает объект Range, представляющий первое слово в коллекции слов.
Last — Возвращает объект Range, представляющий последнее слово в коллекции слов.
Методы
Item(index) — Возвращает отдельный объект Range в коллекции Words.
Index – Номер объекта.
Для доступа к отдельному слову можно напрямую указать его номер в круглых скобках после имени объекта, например:
Set oWords = ActiveDocument.Words
oWors(3)
|
Как видим, количество материала мало – а если возможности ограничены, то начинает работать смекалка. И так, для закрепления материала мы напишем два примера на языке программирования VBScript и JScript. Задачи программного кода следующие:
- Создать новый документ
- Вставить в документ заданный текст
- Отформатировать текст
- Разбить текст на слова и определить общее количество слов и количество слов в каждом абзаце.
- Как бонус – надо определить количество слов, выделенных жирным стилем.
' ---------------------------------------------------------------------------- ' Разбивка текста на слов и подсчет их количества ' Words.vbs ' ---------------------------------------------------------------------------- Option Explicit dim oWord, oDoc, oSel, oRange, oPars, oWords dim REnd, i, j, LText, LRandom dim oParsCount, oWordsCount, oWordsCountAll, oWordsCountBold oWordsCount = 0 oWordsCountAll = 0 oWordsCountBold = 0 set oWord = WScript.CreateObject("Word.Application") ' Объект Word set oDoc = oWord.Documents ' Коллекция Documents oDoc.Add() ' Создаем новый документ set oSel = oWord.Selection ' Объект Selection oWord.Visible = True ' Делаем документ видимым set oRange = oDoc(1).Range() ' Объект Range LText= "Нужно разбить текст на слова, отформатировать его и - получить статистику. Ура! " For i=0 to 5 oSel.TypeText LText & LText & LText oSel.TypeParagraph Next set oPars = oRange.Paragraphs ' Коллекция Paragraps set oWords = oRange.Words ' Коллекция Words REnd = oPars(oPars.Count).Range.End ' Конечная позиция в тексте randomize ' включаем генератор случайных чисел ' ------------------------------------------------------------------- ' Делаем слово жирным в случайном порядке ' ------------------------------------------------------------------- for i = 1 to oWords.Count LRandom=int(rnd(1)*3) if LRandom<2 then oWords(i).Font.Bold=true end if next ' ------------------------------------------------------------------- call WordsStatistik MsgBox oParsCount & vbCrLf & "Всего слов - " & oWordsCountAll & vbCrLf & "Жирных слов - " & oWordsCountBold ' ------------------------------------------------------------------- ' Разбиваем текст на слова и делаем подсчеты ' ------------------------------------------------------------------- Sub WordsStatistik() dim PC PC = oPars.Count for i = 1 to PC call LRange(i, i) for j = 1 to oWords.Count if ((oWords(j) <> ". ") and (oWords(j) <> "! ") and (oWords(j) <> ", ") and (oWords(j) <> "- ") and (oWords(j) <> Chr(13))) then oWordsCount = oWordsCount + 1 if oWords(j).Font.Bold = true then oWordsCountBold = oWordsCountBold + 1 end if end if next oParsCount = oParsCount & "Абзац " & i & " слов: " & oWordsCount & vbCrLf ' разбить текст на слова oWordsCountAll = oWordsCountAll + oWordsCount oWordsCount = 0 next End Sub ' ------------------------------------------------------------------- ' Параметры выбора абзаца ' ------------------------------------------------------------------- Sub LRange(a, b) oRange.SetRange 0, REnd oRange.SetRange oPars(a).Range.Start, oPars(b).Range.End End Sub |
// ---------------------------------------------------------------------------- // Разбивка текста на слов и подсчет их количества // Words.js // ---------------------------------------------------------------------------- var oWord, oDoc, oSel, oRange, oPars, oWords; var REnd, i, j, LText, LRandom; var oParsCount = "", oWordsCount = 0, oWordsCountAll = 0, oWordsCountBold = 0; oWord = WScript.CreateObject("Word.Application"); // Объект Word oDoc = oWord.Documents; // Коллекция Documents oDoc.Add(); // Создаем новый документ oSel = oWord.Selection; // Объект Selection oWord.Visible = true; // Делаем документ видимым oRange = oDoc(1).Range(); // Объект Range LText= "Нужно разбить текст на слова, отформатировать его и - получить статистику. Ура! "; for (i=0; i<=5; i++){ oSel.TypeText(LText + LText + LText) oSel.TypeParagraph(); } oPars = oRange.Paragraphs; // Коллекция Paragraps oWords = oRange.Words; // Коллекция Words REnd = oPars(oPars.Count).Range.End; // Конечная позиция в тексте // ------------------------------------------------------------------- // Делаем слово жирным в случайном порядке // ------------------------------------------------------------------- for (i = 1; i<=oWords.Count; i++){ LRandom=Math.random() if (LRandom<0.5){ oWords(i).Font.Bold=true } } // ------------------------------------------------------------------- WordsStatistik() WScript.Echo(oParsCount + "\nВсего слов - " + oWordsCountAll + "\nЖирных слов - " + oWordsCountBold) // ------------------------------------------------------------------- // Разбиваем текст на слова и делаем подсчеты // ------------------------------------------------------------------- function WordsStatistik(){ var PC = oPars.Count for (i = 1; i<=PC; i++){ LRange(i, i) for (j = 1; j<=oWords.Count; j++){ if ((oWords(j) != ". ") && (oWords(j) != "! ") && (oWords(j) != ", ") && (oWords(j) != "- ") && (oWords(j) != String.fromCharCode(13))){ oWordsCount ++; if (oWords(j).Font.Bold){ oWordsCountBold ++; } } } oParsCount = oParsCount + "Абзац " + i + " слов: " + oWordsCount + "\n"; // разбить текст на слова oWordsCountAll += oWordsCount; oWordsCount = 0; } } // ------------------------------------------------------------------- // Параметры выбора абзаца // ------------------------------------------------------------------- function LRange(a, b){ oRange.SetRange(0, REnd); oRange.SetRange(oPars(a).Range.Start, oPars(b).Range.End); } |
И так, программирование закончено, можно приступать к пояснениям…
Важно отметить, что сама коллекция Words учитывает и пробелы. Поясняю, допустим, у нас есть строка «Привет Мир», между словами есть пять пробелов, и поэтому, в коллекции будут находиться два слова, причем первое слово будет содержать эти пробелы. Довольно неудобно, если честно, так как при написании программы для обработки и разбивки текста на слова, придется писать дополнительную строку кода, содержащую функцию для очистки строкового выражения (слова) от пробелов.
В самом сценарии мы создали две процедуры (функции):
WordsStatistik – Тут вначале происходит присвоение переменной PC значения oPars.Count (количество параграфов в тексте). Далее следуют два цикла for, в первом цикле происходит перебор всех абзацев, во втором цикле (он является вложенным) – происходит перебор всех слов для текущего абзаца. Также мы добавили условие проверки текущего значения коллекции Words, мы пропускаем перевод строки (ASCII код 13), запятую, восклицательный знак и точку. Конечно, если бы текст был неизвестным нам, то пришлось бы создать массив, содержащий все пунктуационные знаки. Далее следует еще одна вложенная проверка условия, а точнее, проверка на то, не является ли текущее слово выделено жирным шрифтом. В итоге, разбив текст по словам, мы получаем статистические данные, хранящиеся в переменных oParsCount – количество абзацев, oWordsCount – количество слов в текущем абзаце, oWordsCountAll – количество всех слов в тексте и oWordsCountBold – количество слов, выделенных жирным.
LRange(a, b) – тут происходит вызов метода SetRange объекта Range. Два параметра, которые принимает функция определяют начальный и конечный абзац, которые нужно выбрать.
В теле сценария мы используем генерацию случайных чисел, что бы в случайном порядке оформить некоторые слова жирным текстом. По сути, на этом все, мы попробовали программным путем разбить текст на слова и произвести их подсчет. Удачи, и до новых встреч.