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

Вывод записей в таблицу

Вывод записей в таблицу

Для того чтобы выводить записи из файла с данными в таблицу Word, мы поступим следующим образом.

Создадим вначале документ-шаблон table.dot, в котором будет нарисована таблица для вывода информации из записной книжки, а также будут написаны заголовок отчета и итоговая информация (рис. 8.7). Задача сценария заключается в создании нового документа по этому шаблону и заполнении строк таблицы нужными данными.


Рис. 8.7. Документ-шаблон table.dot

Напомним, как создается новый шаблон в Word. Запустив Word, нужно выбрать в меню Файл (File) пункт Создать (New) и установить переключатель Создать (New) в положение шаблон (template) (рис. 8.8)


Рис. 8.8. Создание в Word нового шаблона

Для обозначения в документе места, откуда будет начинаться вывод текста, в шаблон мы добавим две закладки (bookmarks). Вставляется закладка в текст следующим образом: курсор перемещается в нужную позицию, в меню Вставка (Insert) выбирается пункт Закладка (Bookmark), в диалоговом окне Закладка (Bookmark) пишется имя закладки и нажимается кнопка Добавить (Add) (рис. 8.9)


Рис. 8.9. Добавление новой закладки в документ Word

Первую закладку с именем "TableStart" нужно поместить в первую ячейку таблицы, т.е. в то место, откуда начнется печататься фамилия для самой первой записи. Вторая закладка с именем "NomRec" ставится после слов "Всего записей:" — здесь будет напечатано число записей (строк в таблице).

Перейдем теперь к рассмотрению сценария ListWordTable.js, который создает на основе шаблона table.dot файл out.doc и заполняет таблицу в этом файле данными из записной книжки book.xml (рис. 8.5).

Основной функцией в этом сценарии является, как обычно, функция Main(). Здесь сначала вызывается функция InitPath() для определения путей к файлам book.xml (переменная PathBook), out.doc (переменная PathOut) и table.dot (переменная PathTempl), после чего создается экземпляр объекта Word.Application:

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

Для создания нового документа на основе шаблона Table.dot мы указываем путь к этому шаблону в качестве аргумента метода Add() семейства Documents:

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

Окно Word делается видимым и максимизируется:

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

В переменной Sel сохраняется ссылка на объект Selection:

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

Как и в сценарии ListWord.js, данные из файла book.xml считываются в массив PersonArr с использованием объектной модели XML DOM. Вывод информации из этого массива в строки таблицу происходит в функции ListPersonArray():

//Сортировка массива и печать его содержимого
function ListPersonArray() {
 var i;
 //Сортировка массива по фамилии
 PersonArr.sort(SortLastName);
 //Переходим к закладке TableStart
 WD.Bookmarks("TableStart").Select();
 //Цикл по всем элементам массива PersonArr
 for (i=0;i<=PersonArr.length-1;i++) {
  //Печать информации для текущей записи
  PrintPerson(PersonArr[i]);
 }
}

Как мы видим, сначала в этой функции в семействе Bookmarks находится закладка с именем "TableStart" и с помощью метода Select() происходит выделение этой закладки в документе. Затем в цикле for вызывается функция PrintPerson(PersReс) для каждого элемента массива PersonArr; в этой функции содержимое полей объекта PersRec последовательно печатается в ячейки таблицы:

//Печать содержимого полей объекта Person
function PrintPerson(PersRec) {
 //Печатаем поля текущей записи
 WA.Selection.Text=PersRec.LastName;
 //Переходим к следующей ячейке таблицы
 WA.Selection.MoveRight(wdCell);
 WA.Selection.Text=PersRec.Phone;
 WA.Selection.MoveRight(wdCell);
 WA.Selection.Text=PersRec.Note;
 if (NomRec<PersonArr.length-1)
  //Если напечатаны еще не все записи, то нужно
  //добавить в таблицу новую строку
  WA.Selection.MoveRight(wdCell);
 //Увеличиваем номер текущей записи
 NomRec++;
}

Итак, печать в таблице происходит следующим образом: после вывода текста в текущую ячейку мы перемещаемся в соседнюю ячейку справа (константа wdCell проинициализирована в самом начале сценария, wdCell=12):

WA.Selection.MoveRight(wdCell);

Если при этом текущая ячейка находилась в третьем столбце, то после такого перемещения в таблицу автоматически будет добавлена новая строка.

После того как все строки в таблице напечатаны, в файл выводится итоговая информация. Для этого мы выделяем закладку с именем "NomRec" и печатаем туда количество элементов в массиве PersonArr:

//Выделяем закладку "NomRec"
WD.Bookmarks("NomRec").Select();
//Печатаем итоговую информацию
WA.Selection.Text=PersonArr.length;

Окончательно сформированный файл сохраняется на диске под именем out.doc:

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

Полностью текст сценария ListWordTable.js приведен в листинге 8.2.

Листинг 8.2. Вывод данных из XML-файла в таблицу Microsoft Word

/*******************************************************************/
/* Имя: ListWordTable.js                                           */
/* Язык: JScript                                                   */
/* Описание: Печать данных из записной книжки в таблицу            */
/*           Microsoft Word                                        */
/*******************************************************************/
//Объявляем переменные
var
 WshShell,  //Экземпляр объекта WshShell
 BasePath,  //Путь к текущему каталогу
 PathBook,  //Путь к файлу с данными
 PathOut,   //Путь к выходному файлу Winword
 PathTempl, //Путь к документу-шаблону
 WA,        //Экземпляр объекта Application
 WD,        //Экземпляр объекта Document
 Sel,       //Экземпляр объекта Selection
 NomRec=0,  //Счетчик количества записей
 PersonRec, //Объект для хранения данных об одном человеке
 PersonArr; //Массив для хранения объектов PersonRec
//Инициализируем константы Winword'а
var wdCell=12, wdAlignParagraphLeft=0, wdAlignParagraphCenter=1, wdWindowStateMaximize=1;
//Построение путей к файлам
function InitPath() {
 var BasePath;
 BasePath=WshShell.CurrentDirectory+"";
 //Путь к файлу с данными
 PathBook=BasePath+"book.xml",
 //Путь к выходному файлу
 PathOut=BasePath+"out.doc";
 //Путь к документу-шаблону
 PathTempl=BasePath+"table.dot";
}
//Конструктор объекта 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);
 }
}
//Печать содержимого полей объекта Person
function PrintPerson(PersRec) {
 //Печатаем поля текущей записи
 WA.Selection.Text=PersRec.LastName;
 //Переходим к следующей ячейке таблицы
 WA.Selection.MoveRight(wdCell);
 WA.Selection.Text=PersRec.Phone;
 WA.Selection.MoveRight(wdCell);
 WA.Selection.Text=PersRec.Note;
 if (NomRec<PersonArr.length-1)
  //Если напечатаны еще не все записи, то нужно
  //добавить в таблицу новую строку
  WA.Selection.MoveRight(wdCell);
 //Увеличиваем номер текущей записи
 NomRec++;
}
//Сортировка массива и печать его содержимого
function ListPersonArray() {
 var i;
 //Сортировка массива по фамилии
 PersonArr.sort(SortLastName);
 //Переходим к закладке TableStart
 WD.Bookmarks("TableStart").Select();
 //Цикл по всем элементам массива 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(PathTempl,false);
 //Делаем окно Winword видимым
 WA.Visible=true;
 //Максимизируем окно Winword
 WA.WindowState=wdWindowStateMaximize;
 //Получаем ссылку на объект Selection
 Sel=WA.Selection;
 //Выводим в таблицу содержимое файла с данными
 ListFile();
 //Выделяем закладку "NomRec"
 WD.Bookmarks("NomRec").Select();
 //Печатаем итоговую информацию
 WA.Selection.Text=PersonArr.length;
 //Сохраняем созданный документ под именем out.doc
 WD.SaveAs(PathOut);
}
/*******************  Начало  **********************************/
Main();
/*************  Конец *********************************************/

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


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