Часть 8. MS Office

В предыдущей статье я рассказывал, как можно управлять различными окнами программ: активизировать их, передавать в них нажатие клавиш… В этой статье мы зайдем немного дальше и научимся управлять приложениями через 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, мне удалось справиться.

   Отправить статью как PDF