Всем привет, на связи автор блога scriptcoding.ru. Продолжая тему объектной модели Word, мы рассмотрим новый компонент, который отвечает за работу с символами в редакторе ворд, по сути, мы рассмотрим примеры, которые позволяют подсчитать количество знаков в Word редакторе.
И так, прежде чем приступать к рассмотрению самого компонента, мы сначала рассмотрим теоретическую часть для самого редактора ворд версии 2007, а именно – как происходит подсчет количества символов.
Количество символов в ворде
И так, что бы узнать количество знаков в Word 2007:
Сразу при вводе текста, да, собственно, при создании нового документа, количество символов отображается в самом низу справа, точнее, количество слов. Если навести указатель мыши в данную область и нажать левой кнопкой мыши, то появится окно «Статистика», в котором будет отображаться количество:
- Страниц
- Слов
- Знаков (без пробелов)
- Знаков (с пробелами)
- Абзацев
- Строк
В меню «Рецензирование» есть пункт «Статистика» в виде пиктограммы, он находится в крайнем левом блоке, нажав на данный пункт, отобразится меню статистики, аналогичное предыдущему.
С вордом 2007 все вроде ясно, но вот давайте сразу рассмотрим, как можно подсчитать количество символов в других версиях Word:
- 2010 – суть действий аналогична версии 2007.
- 2003 – для подсчета знаков в данной версии ворд, нужно войти в меню «Сервис» и выбрать пункт «Статистика».
Стоит отменить тот факт, что в ворд можно просмотреть не только количество знаков для всего документа, но и для выделенной области текста, достаточно выбрать нужный фрагмент, и статистика будет показана только для него. Если вы любитель различных сочетаний клавиш, то для просмотра количества символов и слов в Word достаточно ввести комбинацию клавиш «Ctrl + Shift +G«.
Хорошо, с теоретической часть разобрались, теперь можно приступить к программной части статьи, а именно, к коллекции Characters.
Коллекция Characters – количество знаков в Word
Коллекция Characters содержит количество символов для заданного выделения (Selection), выбора (Range) и документа (Document). Стоит учитывать тот факт, что в коллекции Characters нет отдельного объекта Character, поскольку каждый отдельный элемент, а по сути – символ, является объектом Range, который представляет отдельный знак.
Для доступа к коллекции используется одноименное свойство объекта Document, Range или Selection.
Методы и свойства
Characters(index) – тут мы задаем номер желаемого символа, с которым хотим работать.
Count– общее количество символов в ворде для заданного выбора, выделения или документа.
Firstи Last– возвращает объект Range, которые представляет предыдущий и следующий элемент в коллекции.
Теперь, как и следует ожидать, я перейду к практической части данной публикации. Я приведу два примера программного кода, которые работают под управлением сервера сценариев Windows Script Host. Оба примера выполняют одну задачу, но их логика работы немного отличается…
Программный код на языке VBScript:
' ---------------------------------------------------------------------------- ' Коллекция Characters ' Подсчет количества знаков в документе Word ' Characters.vbs ' ---------------------------------------------------------------------------- Option Explicit dim oWord, oDoc, oSel, i, oPars, MyText, oRange Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents oDoc.Add() Set oSel = oWord.Selection Set oRange = oDoc(1).Range Set oPars = oRange.Paragraphs oWord.Visible = True MyText = "Определяем количество символов в ворде. " For i=0 to 5 oSel.TypeText MyText & MyText & MyText oSel.TypeParagraph Next CharDoc LSel LRange 1,3 ' ******************************************************** ' количество знаков в Word для всего документа ' ******************************************************** Sub CharDoc Statistic oWord.ActiveDocument.Characters.Count End Sub ' ************************************************** ' количество знаков в Word для выделения ' ************************************************** Sub LSel dim SEnd oWord.Documents(1).Select ' выделяем весь текст SEnd = oSel.End ' конец выделения ' выделяем заданный диапазон With oSel .Start= 0 .End= Round(SEnd / 4) End With Statistic oSel.Characters.Count oSel.Collapse ' убираем выделение End Sub ' ************************************************** ' количество знаков в Word для выбора ' ************************************************** Sub LRange(a, b) oRange.SetRange oPars(a).Range.Start, oPars(b).Range.End Statistic oRange.Characters.Count End Sub ' ************************************************************* ' подсчет статистики по количеству символов в Word ' ************************************************************* Sub Statistic (d) dim j, a1, a2, a3, a4 a1 = 0 ' перевод строки a2 = 0 ' пробел a3 = 0 ' прочие символы for j=1 to d Select case oWord.ActiveDocument.Characters(j) case chr(13) a1=a1+1 case chr(32) a2=a2+1 case else a3 = a3 + 1 End Select next MsgBox "символов без пробелов" & vbTab & a3 & vbCrLf &_ "символов с пробелами" & vbTab & a3 + a2 & vbCrLf &_ "пробелов" & vbTab & a2 & vbCrLf &_ "абзацев" & vbTab & a1,, "Статистика" End Sub |
Логика работы довольно проста: создается новый документ Word, далее вставляется произвольный текст с пробелами и абзацами, после происходит поэтапный вызов процедур, которые отвечают за подсчет количества символов в ворде для всего документа, выделения и выбора:
Statistic (d) – данная процедура вызывается из тела остальных подпрограмм, ей передается только один параметр, который показывает, от какого объекта происходит доступ к коллекции Characters. Переменные a1, a2 и a3 будут содержать количество пробелов, перевод строк и прочих символов, соответственно. Цикл For производит пробег по всем знакам, содержащимся в заданной области. Функция vbs – CHR позволяет получить символ по заданному коду, данные проверяются конструкцией Select Case.
CharDoc – самая простая процедура, так как тут мы просто вызываем Statistic с параметром oWord.ActiveDocument.Characters.Count.
LSel – тут происходит выделение части текста, в котором мы хотим произвести подсчет количества знаков.
LRange – отвечает за выбор заданных абзацев.
Программный код на языке Jscript:
// ---------------------------------------------------------------------------- // Коллекция Characters // Подсчет количества знаков в документе Word // Characters.vbs // ---------------------------------------------------------------------------- var oWord, oDoc, oSel, i, oPars, MyText, oRange; oWord = WScript.CreateObject("Word.Application"); oDoc = oWord.Documents; oDoc.Add(); oSel = oWord.Selection; oRange = oDoc(1).Range(); oPars = oRange.Paragraphs; oWord.Visible = true; MyText = "Определяем количество символов в ворде. "; for (i=0; i<=5; i++){ oSel.TypeText(MyText + MyText + MyText); oSel.TypeParagraph(); } CharDoc(); LSel(); LRange(1,3); // ******************************************************** // количество знаков в Word для всего документа // ******************************************************** function CharDoc(){ Statistic(oWord.ActiveDocument.Characters.Count); } // ************************************************** // количество знаков в Word для выделения // ************************************************** function LSel(){ var SEnd = oSel.End; // конец выделения oWord.Documents(1).Select(); // выделяем весь текст // выделяем заданный диапазон with(oSel){ Start= 0; End= Math.round(SEnd / 4); } Statistic(oSel.Characters.Count); oSel.Collapse(); // убираем выделение } // ************************************************** // количество знаков в Word для выбора // ************************************************** function LRange(a, b){ oRange.SetRange(oPars(a).Range.Start, oPars(b).Range.End); Statistic(oRange.Characters.Count); } // ************************************************************* // подсчет статистики по количеству символов в Word // ************************************************************* function Statistic(d){ var a1 = 0; // перевод строки var a2 = 0; // пробел var a3 = 0; // прочие символы var a4; for(j=1; j<=d; j++){ if(oWord.ActiveDocument.Characters(j) == String.fromCharCode(13)){ a1++; }else{ if(oWord.ActiveDocument.Characters(j) == String.fromCharCode(32)){ a2++; }else{ a3++; } } } a4 = a3 + a2; WScript.Echo("символов без пробелов\t" + a3 + "\nсимволов с пробелами\t" + a4 + "\nпробелов\t" + a2 + "\nабзацев\t" + a1); } |
В данном примере мне пришлось вместо конструкции Switch … Case использовать рядовой оператор IF, так как конструкция не хотела обрабатывать код символа. За получение символа пол его коду отвечает внутренняя функция объекта String – fromCharCode.
Важно отметить, что сам текстовый редактор Word выдает больше информации чем приведенный выше программный код, плюс, в ворде при подсчете количества знаков данные учитываются более «корректно», для примера, не учитывается пустой абзац. Конечно, если немного посидеть дольше, то можно получить аналогичные результаты и для программного кода, но…. Цель статьи – показать лишь пример, а не изобретать колесо.