|
||||
|
Глава 8 Взаимодействие сценариев с Microsoft Office Не будет большим преувеличением сказать, что почти на всех компьютерах с операционной системой Windows установлены программы пакета Microsoft Office. Эти приложения являются серверами автоматизации, т.е. их действиями можно управлять из внешних программ, в том числе и из сценариев WSH. В этой главе мы рассмотрим на примерах, каким образом можно выводить из сценариев WSH информацию в две наиболее распространенные офисные программы — Microsoft Word и Microsoft Excel. Объектные модели Microsoft Word и Excel Для того чтобы использовать из сценариев WSH те возможности, которые поддерживают программы Word и Excel, необходимо знать, какие именно объекты предоставляются для внешнего использования этими серверами автоматизации и как объекты соотносятся друг с другом. Хотя объектные модели различных приложений Microsoft Office довольно сложны (например, Word содержит порядка 200 взаимосвязанных друг с другом объектов), они очень похожи друг на друга, причем для практических целей достаточно понять принцип работы с несколькими ключевыми объектами. Здесь мы не будем останавливаться на подробном рассмотрении свойств и методов объектов Word и Excel (для желающих глубже познакомиться с этой темой можно порекомендовать, например, замечательную книгу [17]), а лишь кратко упомянем, какие именно объекты будут использоваться в рассмотренных ниже примерах сценариев. Увидеть структуру объектной модели Word можно воспользовавшись встроенной в Word справкой по Visual Basic (рис. 8.1). Рис. 8.1. Объектная модель Microsoft Word Итак, на самом верхнем уровне объектной модели Word находится объект Application, который представляет непосредственно само приложение Word и содержит (в качестве свойств) все остальные объекты. Таким образом, объект Applicationиспользуется для получения доступа к любому другому объекту Word. Семейство Documentsявляется свойством объекта Applicationи содержит набор объектов Document, каждый из которых соответствует открытому в Word документу. Класс Documentsпонадобится нам в сценариях для создания новых документов. Объект Documentсодержит в качестве своих свойств семейства различных объектов документа; символов ( Characters), слов ( Words), предложений ( Sentences), параграфов ( Paragraphs) и т.д. В одном из рассмотренных ниже сценариев, например, нам понадобится работать с семейством закладок в документе ( Bookmarks). Объект Selectionпозволяет работать с выделенным фрагментом текста (этот фрагмент может быть и пустым). Таким образом, можно сказать, что объект Selectionоткрывает путь в документ, т.к. он предоставляет доступ к выделенному фрагменту документа. В частности, у объекта Selectionимеется метод TypeText(Text), с помощью которого можно вставлять текст в документ. Используя свойства этого объекта (которые, в свою очередь, могут являться объектами со своими свойствами), можно управлять параметрами выделенного фрагмента, например, устанавливать нужный размер и гарнитуру шрифта, выравнивать параграфы по центру и т.п. Объектная модель Excel построена по тому же принципу, что и объектная модель Word. Основным объектом, содержащим все остальные, является Application(рис. 8.2). Рис. 8.2. Объектная модель Microsoft Excel Напомним, что отдельные файлы в Excel называются рабочими книгами. Семейство Workbooksв Excel является аналогом семейства Documentsв Word и содержит набор объектов Workbook(аналог объекта Documentв Word), каждый из которых соответствует открытой в Word рабочей книге. Новая рабочая книга создается с помощью метода Add()объекта Workbooks. Для доступа к ячейкам активного рабочего листа Excel используется свойство Cellsобъекта Application. Для получения или изменения значения отдельной ячейки применяется конструкция Cells(row, column).Value, где rowи columnявляются соответственно номерами строки и столбца, на пересечении которых находится данная ячейка. В Excel, как и в Word, имеется объект Selection, позволяющий работать с выделенным фрагментом электронной таблицы. Самым простым способом выделить диапазон ячеек активного рабочего листа является использование метода Select()объекта Range. Например, выражение Range("A1:C1").Select()позволяет выделить три смежные ячейки: " A1", " B1" и " C1". Для того чтобы понять, какой именно объект Word или Excel нужно использовать для решения той или иной задачи, часто проще всего бывает проделать в соответствующем приложении необходимые манипуляции вручную, включив предварительно режим записи макроса. В результате мы получим текст макроса на языке VBA (Visual Basic for Applications), из которого будет ясно, какие методы и с какими параметрами нужно вызывать и какие значения нужно присваивать свойствам объектов. В качестве простой иллюстрации проделаем следующие действия. Запустим Word, запустим Macro Recorder (Сервис|Макрос|Начать запись (Tools|Macros|Record)), назовем новый макрос "Andrey" и нажмем на кнопку OK (рис. 8.3). Рис. 8.3. Создание нового макроса в Macro Recorder После этого напишем в документе слово "Андрей" и прекратим запись макроса. Теперь можно посмотреть содержимое записанного макроса. Для этого нужно выбрать пункт Макросы (Macroses) в меню Сервис|Макрос (Tools|Macros), выделить макрос "Andrey" в списке всех доступных макросов и нажать кнопку Изменить (Edit). В открывшемся окне редактора Visual Basic появится текст макроса: Sub Андрей() ' ' Андрей Макрос ' Макрос записан 01.08.02 Андрей Владимирович Попов ' Selection.TypeText Text:="Андрей" End Sub Как мы видим, для печати слова в документе был использован метод TypeTextобъекта Selection. Макросы в Excel записываются и редактируются аналогичным образом. Вывод данных из записной книжки в документ Microsoft Word В качестве примера взаимодействия WSH с Microsoft Word мы рассмотрим два сценария, которые будут создавать документы Word и выводить туда информацию из записной книжки в XML-формате, которая хранится в файле book.xml. Рис. 8.4. Вывод данных из XML-файла в документ Word в виде обычного текста В первом из этих сценариев поля каждой записи будут располагаться друг под другом, т.е. информация печатается в виде обычного текста (рис. 8.4). Второй сценарий будет заполнять данными из XML-файла строки таблицы в документе Word (рис. 8.5). Рис. 8.5. Вывод данных из XML-файла в таблицу Word Вывод записей в виде обычного текста Для печати данных из 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(); /************* Конец *********************************************/ Вывод записей в таблицу Для того чтобы выводить записи из файла с данными в таблицу 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(); /************* Конец *********************************************/ Вывод данных из записной книжки в таблицу 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]); } } В функции P rintPerson(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 id="list_xl"> <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> смотреть тут |
|
||
Главная | Контакты | Нашёл ошибку | Прислать материал | Добавить в избранное |
||||
|