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

Вывод данных из записной книжки в таблицу Microsoft Excel

Вывод данных из записной книжки в таблицу Microsoft Excel

Напишем сценарий, который будет создавать файл (рабочую книгу) Microsoft Excel и заносить туда данные из записной книжки (рис. 8.10).


Рис. 8.10. Рабочая книга Microsoft Excel с данными из файла book.xml

Для того чтобы использовать определенные в Excel именные константы без их предварительной инициализации (как мы это делали в сценариях, работающих с Word), наш сценарий будет представлять собой WS-файл ListXLS.wsf, в котором мы определим с помощью тега <reference> ссылку на объект Excel.Sheet:

<reference object="Excel.Sheet"/>

Основная функция сценария Main() как всегда начинается с создания объекта WshShell и вызова функции InitPath(), в которой определяется путь к файлу с данными book.xls и выходному файлу out.xls:

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

Для того чтобы запустить Excel и получить доступ к его интерфейсам, нужно создать экземпляр объекта Excel.Application (переменная XL):

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

Чтобы визуально контролировать процесс вывода информации, окно Excel мы сделаем видимым:

//Делаем окно Microsoft Excel видимым
XL.Visible=true;

Для создания в Excel нового файла (рабочей книги) используется метод Add() семейства Workbooks:

//Открываем новую рабочую книгу
XL.WorkBooks.Add();

Затем в сценарии выставляется необходимая ширина трех первых колонок (здесь мы будем печатать имя, фамилию и номер телефона). Для этого следует присвоить нужные значения свойству ColumnWidth соответствующих элементов коллекции Columns:

//Устанавливаем нужную ширину колонок
XL.Columns(1).ColumnWidth = 40;
XL.Columns(2).ColumnWidth = 40;
XL.Columns(3).ColumnWidth = 10;

Заголовок отчета (названия столбцов) печатается в функции TopReport():

//Вывод заголовка отчета
function TopReport() {
  //Печатаем в ячейки текст
 XL.Cells(1,1).Value="Фамилия";
 XL.Cells(1,2).Value="Имя";
 XL.Cells(1,3).Value="Телефон";
 //Выделяем три ячейки
 XL.Range("A1:C1").Select();
 //Устанавливаем полужирный текст для выделенного диапазона
 XL.Selection.Font.Bold = true;
 //Устанавливаем выравнивание по центру для выделенного диапазона
 XL.Selection.HorizontalAlignment=xlCenter;
}

Как мы видим, доступ к ячейке можно получить с помощью свойства Сells объекта Application, указав в круглых скобках индексы строки и столбца, на пересечении которых находится данная ячейка (нумерация строк и столбцов начинается с единицы). Свойство Value соответствует содержимому ячейки.

Так как названия столбцов должны быть выделены полужирным шрифтом и выровнены по центру, мы в функции TopReport() с помощью метода Select() объекта Range сначала выделяем сразу три ячейки ("A1", "B1" и "С1"):

//Выделяем три ячейки XL.Range("A1:C1").Select();

а затем устанавливаем необходимые свойства у объекта Selection, который соответствует выделенному диапазону:

//Устанавливаем полужирный текст для выделенного диапазона
XL.Selection.Font.Bold = true;
//Устанавливаем выравнивание по центру для выделенного диапазона
XL.Selection.HorizontalAlignment=xlCenter;

Как и во всех предыдущих сценариях этой главы, данные из файла book.xml посредством функции FileToArray() заносятся в массив PersonArr. Содержимое этого массива сортируется по фамилии и выводится в рабочую книгу Excel в функции ListPersonArray() (этот шаг также является одинаковым во всех сценариях):

//Сортировка массива и печать его содержимого
function ListPersonArray() {
 var i;
 //Сортировка массива по фамилии
 PersonArr.sort(SortLastName);
 for (i=0;i<=PersonArr.length-1;i++) {
  PrintPerson(PersonArr[i]);
 }
}

В функции PrintPerson(PersRec) происходит печать фамилии, имени и номера телефона для одной записиPersRec (напомним, что эта запись является экземпляром объекта Person). Для этого нужно определить номер строки, в ячейки которой будут записаны данные, что делается с помощью увеличения значения счетчика количества записей NomRec:

//Печать содержимого полей объекта Person
function PrintPerson(PersRec) {
 //Увеличиваем счетчик количества записей
 NomRec++;
 //В первом столбце печатаем фамилию
 XL.Cells(NomRec+1,1).Value=PersRec.LastName;
 //Во втором столбце печатаем имя
 XL.Cells(NomRec+1,2).Value=PersRec.Name;
 //В третьем столбце печатаем телефон
 XL.Cells(NomRec+1,3).Value=PersRec.Phone;
}

Полностью текст сценария ListXLS.wsf приведен в листинге 8.3.

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

<package>
<job>
<runtime>
<description>
Имя: ListXLS.wsf
Описание: Печать данных из записной книжки в Microsoft Excel
</description>
</runtime>
<reference object="Excel.Sheet"/>
<script language="JScript">
var
 WshShell,  //Экземпляр объекта WshShell
 BasePath,  //Путь к текущему каталогу
 PathBook,  //Путь к файлу с данными
 PathOut,   //Путь к выходному файлу Winword
 XL,        //Экземпляр объекта Application
 NomRec=0,  //Счетчик количества записей
 PersonRec, //Объект для хранения данных об одном человеке
 PersonArr; //Массив для хранения объектов PersonRec
//Построение путей к файлам
function InitPath() {
 var BasePath;
 BasePath=WshShell.CurrentDirectory+"";
 //Путь к файлу с данными
 PathBook=BasePath+"book.xml",
 //Путь к выходному файлу
 PathOut=BasePath+"out.xml";
}
//Конструктор объекта 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() {
  //Печатаем в ячейки текст
 XL.Cells(1,1).Value="Фамилия";
 XL.Cells(1,2).Value="Имя";
 XL.Cells(1,3).Value="Телефон";
 //Выделяем три ячейки
 XL.Range("A1:C1").Select();
 //Устанавливаем полужирный текст для выделенного диапазона
 XL.Selection.Font.Bold = true;
 //Устанавливаем выравнивание по центру для выделенного диапазона
 XL.Selection.HorizontalAlignment=xlCenter;
}
//Печать содержимого полей объекта Person
function PrintPerson(PersRec) {
 //Увеличиваем счетчик количества записей
 NomRec++;
 //В первом столбце печатаем фамилию
 XL.Cells(NomRec+1,1).Value=PersRec.LastName;
 //Во втором столбце печатаем имя
 XL.Cells(NomRec+1,2).Value=PersRec.Name;
 //В третьем столбце печатаем телефон
 XL.Cells(NomRec+1,3).Value=PersRec.Phone;
}
//Сортировка массива и печать его содержимого
function ListPersonArray() {
 var i;
 //Сортировка массива по фамилии
 PersonArr.sort(SortLastName);
 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
 XL=WScript.CreateObject("Excel.Application");
 //Делаем окно Microsoft Excel видимым
 XL.Visible=true;
 //Открываем новую рабочую книгу
 XL.WorkBooks.Add();
 //Устанавливаем нужную ширину колонок
 XL.Columns(1).ColumnWidth = 40;
 XL.Columns(2).ColumnWidth = 40;
 XL.Columns(3).ColumnWidth = 10;
 //Печатаем заголовок таблицы
 TopReport();
 //Печатаем содержимое файла с данными
 ListFile();
 //Сохраняем созданный документ под именем out.xls
 XL.ActiveWorkbook.SaveAs(PathOut);
}
//Запускаем основную функцию
Main();
</script>
</job>
</package>

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


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