Книга: Windows Script Host для Windows 2000/XP

Вывод записей в виде обычного текста

Вывод записей в виде обычного текста

Для печати данных из book.xml в документ Word в режиме обычного текста мы создадим JScript-сценарий ListWord.js. За основу этого сценария взят рассмотренный в главе 6 сценарий SortNameXMLDOM.js, в котором вывод информации производился в текстовый файл, открываемый затем в Блокноте.

Основная функция Main() сценария ListWord.js начинается с создания объекта WshShell и вызова функции InitPath(), в которой определяются пути к файлам book.xml (переменная PathBook) и out.doc (переменная PathOut):

//Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
//Определяем пути к файлам
InitPath();

Для запуска новой копии Microsoft Word мы создаем экземпляр объекта Word.Application:

//Создаем объект Application
WA=WScript.CreateObject("Word.Application");

После запуска Word в нем создается новый пустой документ с помощью метода Add() семейства Documents; ссылка на получающийся в результате экземпляр объекта Document сохраняется в переменной WD:

//Создаем новый документ
wd=WA.Documents.Add();

Так как процесс печати данных из сценария может быть довольно длительным, окно Word мы сделаем видимым и максимизируем его:

//Делаем окно Winword видимым
WA.Visible=true;
//Максимизируем окно Winword
WA.WindowState=wdWindowStateMaximize;

Для того чтобы начать печатать в окне Word, нужно получить ссылку на объект Selection (глобальная переменная Sel), который позволяет работать с выделенным текстом:

//Получаем ссылку на объект Selection
Sel=WA.Selection;

С помощью свойства Font объекта Selection мы устанавливаем размер шрифта, которым далее будет печататься текст:

//Устанавливаем размер шрифта 12 пт
Sel.Font.Size=12;
 

Теперь мы полностью готовы начать печать текста. Сначала в функции TopReport() печатается заголовок отчета:

//Печатаем заголовок отчета
TopReport("Общий список");

Функция TopReport(Mess) имеет следующий вид:

//Вывод заголовка отчета
function TopReport(Mess) {
 //Устанавливаем выравнивание по центру
 Sel.ParagraphFormat.Alignment=wdAlignParagraphCenter;
 //Устанавливаем полужирный шрифт
 Sel.Font.Bold=true;
 //Выводим сообщение с переводом строки
 Sel.TypeText(Mess+"n");
 Sel.TypeText("n");
 //Устанавливаем выравнивание слева
 Sel.ParagraphFormat.Alignment=wdAlignParagraphLeft;
 //Отменяем полужирный шрифт
 Sel.Font.Bold=false;
}
 

Как мы видим, текст печатается с помощью метода TypeText(), а форматируется путем изменения соответствующих свойств объекта Selection (которые, в свою очередь, являются объектами того или иного типа). Отметим, что именные константы, которые используются для форматирования текста, были предварительно проинициализированы в самом начале сценария:

//Инициализируем константы Winword'а
var wdAlignParagraphLeft=0, wdAlignParagraphCenter=1, wdWindowStateMaximize=1;

После выполнения функции TopReport() в документе Word будет полужирным шрифтом с выравниванием по центру напечатана строка "Общий список", а курсор установится на две строки ниже (рис. 8.6).


Рис. 8.6. Заголовок отчета, напечатанный в сценарии ListWord.js

Далее в сценарии данные из XML-файла book.xml считываются в массив PersonArr с использованием объектной модели XML DOM (этот процесс был подробно описан в главе 7). Печать информации из элемента массива PersonArr (экземпляра объекта Person) производится в функции PrintPerson(PersRec):

//Печать содержимого полей объекта Person
function PrintPerson(PersRec) {
 //Печатаем поля текущей записи
 TypeString("Фамилия",PersRec.LastName);
 TypeString("Имя",PersRec.Name);
 TypeString("Телефон",PersRec.Phone);
 TypeString("Улица",PersRec.Street);
 TypeString("Дом",PersRec.House);
 TypeString("Кв.",PersRec.App);
 TypeString("Заметки",PersRec.Note);
 //Печатаем разделитель с переводом строки
 Sel.TypeText("-------------------------------------n");
 //Увеличиваем номер текущей записи
 NomRec++;
}

Здесь используется функция TypeString(Title, Сontent), в которой происходит печать наклонным шрифтом названия поля (параметр Title) и прямым шрифтом значения этого поля (параметр Content):

//Вывод одного поля из записи
function TypeString(Title, Content) {
 //Устанавливаем наклонный шрифт
 Sel.Font.Italic=true;
 //Печатаем название поля
 Sel.TypeText(Title+":t");
 //Отменяем наклонный шрифт
 Sel.Font.Italic=false;
 //Печатаем содержимое поля
 Sel.TypeText(Content+"n");
}

В качестве итоговой информации в функции BottomReport(Mess) печатается общее количество записей в книжке:

//Вывод итоговой информации
function BottomReport(Mess) {
 //Устанавливаем полужирный шрифт
 Sel.Font.Bold=true;
 //Выводим сообщение с переводом строки
 Sel.TypeText(Mess+"n");
 //Отменяем полужирный шрифт
 Sel.Font.Bold=false;
}

После того как вся нужная информация напечатана в документе, он сохраняется на диске с помощью метода SaveAs() объекта Document:

//Сохраняем созданный документ под именем out.doc
WD.SaveAs(PathOut);

В листинге 8.1 приводится полный текст сценария ListWord.js.

Листинг 8.1. Вывод данных из XML-файла в Microsoft Word (обычный текст)

/*******************************************************************/
/* Имя: ListWord.js                                               */
/* Язык: JScript                                                   */
/* Описание: Печать данных из записной книжки в                    */
/*           файл Microsoft Word                                   */
/*******************************************************************/
//Объявляем переменные
var
 WshShell,  //Экземпляр объекта WshShell
 BasePath,  //Путь к текущему каталогу
 PathBook,  //Путь к файлу с данными
 PathOut,   //Путь к выходному файлу Winword
 WA,        //Экземпляр объекта Application
 WD,        //Экземпляр объекта Document
 Sel,       //Экземпляр объекта Selection
 NomRec=0,  //Счетчик количества записей
 PersonRec, //Объект для хранения данных об одном человеке
 PersonArr; //Массив для хранения объектов PersonRec
//Инициализируем константы Winword'а
var wdAlignParagraphLeft=0,wdAlignParagraphCenter=1,wdWindowStateMaximize=1;
//Построение путей к файлам
function InitPath() {
var BasePath;
 BasePath=WshShell.CurrentDirectory+"";
 //Путь к файлу с данными
 PathBook=BasePath+"book.xml",
 //Путь к выходному файлу
 PathOut=BasePath+"out.doc";
}
//Конструктор объекта Person
function Person(LastName,Name,Phone,Street,House,App,Note) {
 this.LastName=LastName; //Фамилия
 this.Name=Name;         //Имя
 this.Phone=Phone;       //Телефон
 this.Street=Street;     //Улица
 this.House=House;       //Дом
 this.App=App;           //Квартира
 this.Note=Note;         //Примечание
}
//Определение значения тега tgName XML-элемента obj
function GetTagVal(obj, tgName) {
 var ElemList;
 //Создаем коллекцию дочерних для obj элементов, которые
 //задаются тегом tgName
 ElemList=obj.getElementsByTagName(tgName);
 //Проверяем, есть ли в коллекции ElemList элементы
 if (ElemList.length>0)
  //Возвращаем значение тега tgName
   return ElemList.item(0).text
 else return "";
}
//Заполнение нового элемента массива
function PersonToArray(XNode) {
 //Создаем новый экземпляр PersonRec объекта Person
 PersonRec=new Person();
 //Заполняем поля объекта PersonRec
 PersonRec.LastName=GetTagVal(XNode,"LastName");
 PersonRec.Name=GetTagVal(XNode,"Name");
 PersonRec.Phone=GetTagVal(XNode,"Phone");
 PersonRec.Street=GetTagVal(XNode,"Street");
 PersonRec.House=GetTagVal(XNode,"House");
 PersonRec.App=GetTagVal(XNode,"App");
 PersonRec.Note=GetTagVal(XNode,"Note");
 //Сохраняем объект PersonRec в массиве
 PersonArr[PersonArr.length]=PersonRec;
}
//Создание массива объектов Person
function FileToArray() {
 var XML,Root,NomRec,CurrNode,i;
 //Создаем массив PersonArr
 PersonArr=new Array();
 //Создаем объект XML DOM
 XML = WScript.CreateObject("Msxml.DOMDocument");
 //Загружаем XML-документ из файла
 XML.load(PathBook);
 //Сохраняем в переменной Root ссылку на корневой элемент документа
 Root=XML.documentElement;
 //Перебираем все дочерние элементы первого уровня вложенности
 //для корневого элемента
 for (i=1; i<=Root.childNodes.length-1;i++) {
  //Выделяем в коллекции XML-элементов i-й элемент
  CurrNode=Root.childNodes.item(i);
  //Добавляем новый элемент в массив объектов Person
  PersonToArray(CurrNode);
 }
}
//Вывод заголовка отчета
function TopReport(Mess) {
 //Устанавливаем выравнивание по центру
 Sel.ParagraphFormat.Alignment=wdAlignParagraphCenter;
 //Устанавливаем полужирный шрифт
 Sel.Font.Bold=true;
 //Выводим сообщение с переводом строки
 Sel.TypeText(Mess+"n");
 Sel.TypeText("n");
 //Устанавливаем выравнивание слева
 Sel.ParagraphFormat.Alignment=wdAlignParagraphLeft;
 //Отменяем полужирный шрифт
 Sel.Font.Bold=false;
}
//Вывод итоговой информации
function BottomReport(Mess) {
 //Устанавливаем полужирный шрифт
 Sel.Font.Bold=true;
 //Выводим сообщение с переводом строки
 Sel.TypeText(Mess+"n");
 //Отменяем полужирный шрифт
 Sel.Font.Bold=false;
}
//Вывод одного поля из записи
function TypeString(Title, Content) {
 //Устанавливаем наклонный шрифт
 Sel.Font.Italic=true;
 //Печатаем название поля
 Sel.TypeText(Title+":t");
 //Отменяем наклонный шрифт
 Sel.Font.Italic=false;
 //Печатаем содержимое поля
 Sel.TypeText(Content+"n");
}
//Печать содержимого полей объекта Person
function PrintPerson(PersRec) {
 //Печатаем поля текущей записи
 TypeString("Фамилия",PersRec.LastName);
 TypeString("Имя",PersRec.Name);
 TypeString("Телефон",PersRec.Phone);
 TypeString("Улица",PersRec.Street);
 TypeString("Дом",PersRec.House);
 TypeString("Кв.",PersRec.App);
 TypeString("Заметки",PersRec.Note);
 //Печатаем разделитель с переводом строки
 Sel.TypeText("-------------------------------------n");
 //Увеличиваем номер текущей записи
 NomRec++;
}
//Сортировка массива и печать его содержимого
function ListPersonArray() {
 var i;
 //Сортировка массива по фамилии
 PersonArr.sort(SortLastName);
 //Цикл по всем элементам массива PersonArr
 for (i=0;i<=PersonArr.length-1;i++) {
  //Печать информации для текущей записи
  PrintPerson(PersonArr[i]);
 }
}
//Функция для сортировки массива по фамилии
function SortLastName(Pers1,Pers2) {
 if (Pers1.LastName<Pers2.LastName) return -1;
 else if (Pers1.LastName==Pers2.LastName) return 0;
 else return 1;
}
//Печать содержимого файла с данными
function ListFile() {
 //Считываем данные из файла в массив
 FileToArray();
 //Печатаем информацию из массива
 ListPersonArray();
}
//Основная запускная функция
function Main() {
 //Создаем объект WshShell
 WshShell = WScript.CreateObject("WScript.Shell");
 //Определяем пути к файлам
 InitPath();
 //Создаем объект Application
 WA=WScript.CreateObject("Word.Application");
 //Создаем новый документ
 WD=WA.Documents.Add();
 //Делаем окно Winword видимым
 WA.Visible=true;
 //Максимизируем окно Winword
 WA.WindowState=wdWindowStateMaximize;
 //Получаем ссылку на объект Selection
 Sel=WA.Selection;
 //Устанавливаем размер шрифта 12 пт
 Sel.Font.Size=12;
 //Печатаем заголовок отчета
 TopReport("Общий список");
 //Печатаем содержимое XML-файла с данными
 ListFile();
 //Печатаем итоговую информацию
 BottomReport("Всего записей: "+PersonArr.length);
 //Сохраняем созданный документ под именем out.doc
 WD.SaveAs(PathOut);
}
/*******************  Начало  **********************************/
Main();
/*************  Конец *********************************************/

Оглавление книги


Генерация: 1.167. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз