В предыдущей статье я рассказывал, как можно управлять различными окнами программ: активизировать их, передавать в них нажатие клавиш… В этой статье мы зайдем немного дальше и научимся управлять приложениями через ActiveX компоненты. Пожалуй, наиболее популярное и частое применение этих знаний может найти отражение в работе с MS Office, а точнее с Word и Excel. Вот над ними мы сегодня и поиздеваемся (все примеры были протестированы в Офис 2000).
Для начала, приведу немножко подредактированный файл примера Microsoft по работе с Excel-ем, сопроводив его попутно своими комментариями:
//JScript //Создаем Екселевский объект, с методами и свойствами которого будем работать var objXL = WScript.CreateObject("Excel.Application"); //Делаем окно видимым и создаем рабочую книгу objXL.Visible = true; objXL.WorkBooks.Add; //Устанавливаем ширину первых трех колонок objXL.Columns(1).ColumnWidth = 20; objXL.Columns(2).ColumnWidth = 30; objXL.Columns(3).ColumnWidth = 40; //Первая строка будет у нас шапкой таблицы //Заполняем значения ячеек objXL.Cells(1, 1).Value = "Название свойства"; objXL.Cells(1, 2).Value = "Значение"; objXL.Cells(1, 3).Value = "Описание"; //Форматируем ячейки, чтобы все было красиво objXL.Range("A1:C1").Select; objXL.Selection.Font.Bold = true; objXL.Selection.Interior.ColorIndex = 1; objXL.Selection.Interior.Pattern = 1; objXL.Selection.Font.ColorIndex = 2; objXL.Columns("B:B").Select; objXL.Selection.HorizontalAlignment = -4131; //Вводим счетчик строк, куда будем записывать информацию var intIndex = 2; //А эта функция как раз и будет выводить нашу информацию построчно function Show(strName, strValue, strDesc) { objXL.Cells(intIndex, 1).Value = strName; objXL.Cells(intIndex, 2).Value = strValue; objXL.Cells(intIndex, 3).Value = strDesc; intIndex++; objXL.Cells(intIndex, 1).Select; } //Итак, заполним таблицу данными о версии wscript установленной на компьютере Show("Name", WScript.Name, "Application Friendly Name"); Show("Version", WScript.Version, "Application Version"); Show("FullName", WScript.FullName, "Application Context: Fully Qualified Name"); Show("Path", WScript.Path, "Application Context: Path Only"); Show("Interactive", WScript.Interactive, "State of Interactive Mode"); //До кучи добавим сведения о параметрах, с которыми запускается скрипт var colArgs = WScript.Arguments; Show("Arguments.Count", colArgs.length, "Number of command line arguments"); for (i = 0; i < colArgs.length; i++) { objXL.Cells(intIndex, 1).Value = "Arguments(" + i + ")"; objXL.Cells(intIndex, 2).Value = colArgs(i); intIndex++; objXL.Cells(intIndex, 1).Select; }
Все весьма прозрачно. Приведу аналогичный пример на VBScript, дабы не заставлять любителей этого языка самостоятельно адаптировать код под него:
Dim objXL Set objXL = WScript.CreateObject("Excel.Application") objXL.Visible = TRUE objXL.WorkBooks.Add objXL.Columns(1).ColumnWidth = 20 objXL.Columns(2).ColumnWidth = 30 objXL.Columns(3).ColumnWidth = 40 objXL.Cells(1, 1).Value = "Название свойства" objXL.Cells(1, 2).Value = "Значение" objXL.Cells(1, 3).Value = "Описание" objXL.Range("A1:C1").Select objXL.Selection.Font.Bold = True objXL.Selection.Interior.ColorIndex = 1 objXL.Selection.Interior.Pattern = 1 objXL.Selection.Font.ColorIndex = 2 objXL.Columns("B:B").Select objXL.Selection.HorizontalAlignment = &hFFFFEFDD Dim intIndex intIndex = 2 Sub Show(strName, strValue, strDesc) objXL.Cells(intIndex, 1).Value = strName objXL.Cells(intIndex, 2).Value = strValue objXL.Cells(intIndex, 3).Value = strDesc intIndex = intIndex + 1 objXL.Cells(intIndex, 1).Select End Sub Call Show("Name", WScript.Name, "Application Friendly Name") Call Show("Version", WScript.Version, "Application Version") Call Show("FullName", WScript.FullName, "Application Context: Fully Qualified Name") Call Show("Path", WScript.Path, "Application Context: Path Only") Call Show("Interactive", WScript.Interactive, "State of Interactive Mode") Dim colArgs Set colArgs = WScript.Arguments Call Show("Arguments.Count", colArgs.Count, "Number of command line arguments") For i = 0 to colArgs.Count - 1 objXL.Cells(intIndex, 1).Value = "Arguments(" & i & ")" objXL.Cells(intIndex, 2).Value = colArgs(i) intIndex = intIndex + 1 objXL.Cells(intIndex, 1).Select Next
Хорошо, а как быть если надо сделать какое-то действие не описанное здесь? Вполне логичный вопрос. Но описать все возможности встроенного в Офис VB в этой статье (как и в 10 статьях) просто невозможно. Эти сведения вам только в качестве информации к размышлению. А все что сверх этой статьи, изучается довольно просто: запускается Word (Excel), включается запись макроса, выполняются нужные вам действия, а потом на основе сгенерированного кода по аналогии пишется скрипт. Нелишним будет почитать и справку (надеюсь вы ее установили?). Замечу, что для работы с приложениями Офиса легче писать скрипты на VBScript, так как справка по встроенному VB сможет удовлетворить даже самым изысканным потребностям.
Именно таким методом (читая справку и анализируя записанные макросы), я сделал практически аналогичный предыдущим скрипт, работающий с Вордом:
//JScript //Создаем объект для работы с Вордом var wrd = new ActiveXObject("Word.Application"); //Создаем новый документ wrd.Documents.Add(); //Получаем указатель на активный документ adoc=wrd.ActiveDocument; //Указатель на область в документе myRange = adoc.Range(Start=0, End=0) //Активизируем Ворд wrd.Visible = true; wrd.Activate(); //Создаем таблицу с одной строкой и тремя столбцами tb0=adoc.tables.Add(Range=myRange, NumRows=1, NumColumns=3); //Задаем ширину столбцов tb0.Columns(1).Width = 80; tb0.Columns(2).Width = 160; tb0.Columns(3).Width = 160; //Заполняем заголовок таблицы tb0.Cell(1,1).Range.InsertAfter("Название свойства"); tb0.Cell(1,2).Range.InsertAfter("Значение"); tb0.Cell(1,3).Range.InsertAfter("Описание"); //Счетчик строк intIndex = 2; //Выводимая в строках таблицы информация Show("Name", WScript.Name, "Application Friendly Name"); Show("Version", WScript.Version, "Application Version"); Show("FullName", WScript.FullName, "Application Context: Fully Qualified Name"); Show("Path", WScript.Path, "Application Context: Path Only"); Show("Interactive", WScript.Interactive, "State of Interactive Mode"); //Ну и сама функция для вывода строк function Show(strName, strValue, strDesc) { tb0.Rows.Add(); tb0.Cell(intIndex, 1).Range.InsertAfter(strName); tb0.Cell(intIndex, 2).Range.InsertAfter(strValue); tb0.Cell(intIndex, 3).Range.InsertAfter(strDesc); intIndex++; }
Надеюсь, с задачей указания основного направления при работе с MS Office, мне удалось справиться.