Онлайн библиотека PLAM.RU


  • Объектные модели Microsoft Word и Excel
  • Вывод данных из записной книжки в документ Microsoft Word
  • Вывод записей в виде обычного текста
  • Вывод записей в таблицу
  • Вывод данных из записной книжки в таблицу Microsoft Excel
  • Глава 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>









    Главная | Контакты | Нашёл ошибку | Прислать материал | Добавить в избранное

    Все материалы представлены для ознакомления и принадлежат их авторам.